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
OptimizedMemoryStreamframförMemoryStreamnär ett dokument i minnet kan överstiga 2GB –MemoryStreamkastar 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) –FileSpecificationimplementerarIDisposable. - Kontrollera
Document.HasEmbeddedFilesinnan du itererarEmbeddedFilesför att hoppa över onödig uppräkning på dokument utan bilagor. - Ställ in
MimeTypeochAFRelationshippå varjeFileSpecificationså att efterföljande PDF-konsumenter kan klassificera bilagor korrekt. - Använd
EmbeddedFileCollection.FindByNameför en enkel namngiven uppslagning istället för att skriva en manuell slinga.
Vanliga problem
| Problem | Orsak | Åtgärd |
|---|---|---|
OutOfMemoryException sparar ett stort dokument till en ström | MemoryStream är begränsad till en enda ~2GB underliggande array | Spara till OptimizedMemoryStream istället |
FileSpecification.GetData() returnerar en tom array | Källströmpositionen var inte återställd innan FileSpecification skapades | Flytta strömmen till position 0 (eller öppna om den) innan du skickar den till FileSpecification |
EmbeddedFiles.FindByName returnerar null | Bilagans 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 post | Flera bilagor har samma namn | Anvä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 / Metod | Beskrivning |
|---|---|
OptimizedMemoryStream | Expanderbar minnesström som överskrider 2GB-gränsen för MemoryStream |
OptimizedMemoryStream.Write | Skriv byte till bufferten |
OptimizedMemoryStream.ToArray | Returnera de buffrade byten som en byte array |
FileSpecification | Inbäddad filbilagsbeskrivare, stödd av en ström eller byte-data |
FileSpecification.GetData | Hämta de råa bytena för en inbäddad fil |
FileSpecification.Params | Metadata (storlek, kontrollsumma, datum) för den inbäddade filen |
EmbeddedFileCollection | Samling av FileSpecification bilagor på en Document |
EmbeddedFileCollection.FindByName | Slå upp en bilaga efter namn |
EmbeddedFileCollection.Delete | Ta bort en bilaga efter namn |
Document.AddEmbeddedFile | Bekvämlighetsmetod för att infoga en fil från råa byte |
Document.EmbeddedFiles | Dokumentets inbäddade filsamling |
Document.HasEmbeddedFiles | Om dokumentet innehåller några inbäddade filer |
FileParams | Omsluter storlek/kontrollsumma/datum-metadata för en inbäddad filström |