Strömmar och filbilagor

Strömmar och filbilagor

Strömmar och filbilagor

Utöver de grundläggande Document.Open/Document.Save-överträdningarna ger Aspose.PDF FOSS för .NET dig finare kontroll över hur byte flödar in och ut ur ett dokument – expanderbara minnesbuffertar för mycket stora filer, och en dedikerad API för att bädda in, inspektera och extrahera filbilagor via FileSpecification och EmbeddedFileCollection.


Expanderande minnesbuffertar över 2GB

MemoryStream lagrar sina data i en enda sammanhängande array, vilket når en gräns nära 2GB. OptimizedMemoryStream lagrar data i fasta block istället, så den kan hantera mycket större dokument när du sparar eller bygger en PDF helt i minnet.

using Aspose.Pdf;

using var doc = Document.Open("large-input.pdf");
using var buffer = new OptimizedMemoryStream();

doc.Save(buffer);

buffer.Seek(0, SeekOrigin.Begin);
byte[] allBytes = buffer.ToArray();
Console.WriteLine($"Buffer length: {buffer.Length}");

Du kan också skriva till den direkt, på samma sätt som du skulle med vilken Stream som helst:

using var buffer = new OptimizedMemoryStream();
byte[] chunk = System.Text.Encoding.UTF8.GetBytes("raw content chunk");

buffer.Write(chunk, 0, chunk.Length);
buffer.WriteByte(0x0A);
buffer.SetLength(buffer.Length);

Bädda in en fil direkt från en ström

FileSpecification kan omsluta en Stream istället för att kräva att du buffrar bilagan till en byte[] först. Detta är användbart när bilagans källa själv är en ström, till exempel ett öppet filhandtag.

using Aspose.Pdf;

using var doc = Document.Open("input.pdf");
using var attachmentStream = File.OpenRead("report.csv");
using var spec = new FileSpecification(attachmentStream, "report.csv", "Quarterly report data");

spec.MimeType = "text/csv";
spec.AFRelationship = AFRelationship.Data;
spec.Encoding = FileEncoding.Zip;

doc.EmbeddedFiles.Add(spec);
doc.Save("with-attachment.pdf");

Bädda in en fil från råa bytes

Document.AddEmbeddedFile är en bekvämlighetsmetod för att bädda in en fil direkt från en bytearray, utan att konstruera en FileSpecification direkt.

using Aspose.Pdf;

using var doc = Document.Open("input.pdf");
byte[] fileData = File.ReadAllBytes("appendix.docx");

doc.AddEmbeddedFile(
    "appendix.docx",
    fileData,
    "Supporting appendix",
    "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    true,
    DateTime.Now,
    DateTime.Now);

doc.Save("with-appendix.pdf");

Enumerera och extrahera inbäddade filer

Document.EmbeddedFiles är en EmbeddedFileCollection som du kan enumerera. Varje post är en FileSpecification, och GetData() returnerar de råa bytes.

using Aspose.Pdf;

using var doc = Document.Open("with-attachment.pdf");

if (doc.HasEmbeddedFiles)
{
    foreach (FileSpecification file in doc.EmbeddedFiles)
    {
        Console.WriteLine($"{file.Name} ({file.Size} bytes, {file.MimeType})");
        byte[] contents = file.GetData();
        File.WriteAllBytes(file.Name, contents);
    }
}

Hitta, inspektera och ta bort bilagor

Använd FindByName för att slå upp en enskild bilaga, Params för att läsa dess metadata, och Delete/DeleteByKey för att ta bort den.

using Aspose.Pdf;

using var doc = Document.Open("with-attachment.pdf");

FileSpecification? found = doc.EmbeddedFiles.FindByName("report.csv");
if (found?.Params is FileParams info)
{
    Console.WriteLine($"{found.Name}: {info.Size} bytes, checksum {info.CheckSum}, modified {info.ModDate}");
}

doc.EmbeddedFiles.Delete("report.csv");
Console.WriteLine($"Remaining attachments: {doc.EmbeddedFiles.Count}");
doc.Save("cleaned.pdf");

Tips och bästa praxis

  • Föredra OptimizedMemoryStream framför MemoryStream när ett dokument i minnet kan överstiga 2GB – MemoryStream kastar ett undantag när dess enda underliggande array når den gränsen.
  • Avsluta FileSpecification-instanser (och alla strömmar du öppnade manuellt för dem) – FileSpecification implementerar IDisposable.
  • Kontrollera Document.HasEmbeddedFiles innan du itererar EmbeddedFiles för att hoppa över onödig uppräkning på dokument utan bilagor.
  • Ställ in MimeType och AFRelationship på varje FileSpecification så att efterföljande PDF-konsumenter kan klassificera bilagor korrekt.
  • Använd EmbeddedFileCollection.FindByName för en enkel namngiven uppslagning istället för att skriva en manuell slinga.

Vanliga problem

ProblemOrsakÅtgärd
OutOfMemoryException sparar ett stort dokument till en strömMemoryStream är begränsad till en enda ~2GB underliggande arraySpara till OptimizedMemoryStream istället
FileSpecification.GetData() returnerar en tom arrayKällströmpositionen var inte återställd innan FileSpecification skapadesFlytta strömmen till position 0 (eller öppna om den) innan du skickar den till FileSpecification
EmbeddedFiles.FindByName returnerar nullBilagans namn matchar inte exakt (uppslagning är namn-baserad)Iterera doc.EmbeddedFiles och jämför Name-värden, eller kontrollera Keys
Att ta bort en bilaga tar bort fel postFlera bilagor har samma namnAnvänd DeleteByKey med den exakta nyckeln från Keys för entydig borttagning

FAQ

Vad är skillnaden mellan MemoryStream och OptimizedMemoryStream?

MemoryStream lagrar sina bytes i en enda sammanhängande array som är begränsad till cirka 2GB. OptimizedMemoryStream lagrar data i fasta storleksblock istället, så den kan växa förbi den gränsen – användbart för Document.Save-operationer som utförs helt i minnet på mycket stora filer.

Kan jag bädda in en fil utan att först ladda den i en byte[]?

Ja. FileSpecification(stream, name, description) accepterar en Stream direkt, så du kan bädda in från File.OpenRead(...) eller någon annan ström utan att buffra den i minnet själv.

Hur får jag ut en inbäddad fil från ett dokument?

Iterera doc.EmbeddedFiles och anropa GetData() på varje FileSpecification för att hämta de råa bytes.

Tar EmbeddedFileCollection.Delete(name) bort varje bilaga med det namnet?

Nej – rikta in dig på en specifik bilaga med DeleteByKey och den specifika nyckeln från Keys om flera bilagor har samma namn.

Är FileSpecification säkert att återanvända i flera dokument?

Nej. FileSpecification implementerar IDisposable och omsluter en enda inbäddad filström; skapa en ny instans per bilaga per dokument.


API Reference Sammanfattning

Klass / MetodBeskrivning
OptimizedMemoryStreamExpanderbar minnesström som överskrider 2GB-gränsen för MemoryStream
OptimizedMemoryStream.WriteSkriv byte till bufferten
OptimizedMemoryStream.ToArrayReturnera de buffrade byten som en byte array
FileSpecificationInbäddad filbilagsbeskrivare, stödd av en ström eller byte-data
FileSpecification.GetDataHämta de råa bytena för en inbäddad fil
FileSpecification.ParamsMetadata (storlek, kontrollsumma, datum) för den inbäddade filen
EmbeddedFileCollectionSamling av FileSpecification bilagor på en Document
EmbeddedFileCollection.FindByNameSlå upp en bilaga efter namn
EmbeddedFileCollection.DeleteTa bort en bilaga efter namn
Document.AddEmbeddedFileBekvämlighetsmetod för att infoga en fil från råa byte
Document.EmbeddedFilesDokumentets inbäddade filsamling
Document.HasEmbeddedFilesOm dokumentet innehåller några inbäddade filer
FileParamsOmsluter storlek/kontrollsumma/datum-metadata för en inbäddad filström

Se även

 Svenska