Adatfolyamok és Fájlcsatolmányok
Adatfolyamok és fájlcsatolások
Az alap Document.Open/Document.Save túlterhelésekön túl, a Aspose.PDF FOSS a .NET számára finomabb vezérlést biztosít a bájtok dokumentumba való be- és kimenetele felett – nagy fájlokhoz növelhető memóriában lévő puffereket, valamint egy dedikált API-t a fájlcsatolások beágyazásához, vizsgálatához és kinyeréséhez a FileSpecification és EmbeddedFileCollection segítségével.
Memóriában lévő pufferek növelése 2GB-nál nagyobb méretben
MemoryStream egyetlen folytonos tömbben tárolja az adatokat, ami körülbelül 2GB-nál korlátozódik. OptimizedMemoryStream ehelyett rögzített méretű darabokban tárolja az adatokat, így sokkal nagyobb dokumentumokat képes kezelni, amikor egy PDF-et teljesen a memóriában ment vagy épít.
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}");Közvetlenül is írhat rá, ugyanúgy, ahogy bármely Stream-nál:
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);Fájl közvetlen beágyazása egy adatfolyamból
FileSpecification képes egy Stream köré csomagolni, anélkül hogy először egy byte[]-ba kellene pufferelnie a csatolást. Ez akkor hasznos, ha a csatolás forrása maga egy adatfolyam, például egy nyitott fájlkezelő.
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");Fájl beágyazása nyers bájtokból
Document.AddEmbeddedFile egy kényelmi metódus egy fájl közvetlenül egy bájt tömbből történő beágyazásához, anélkül, hogy közvetlenül FileSpecification-t hoznánk létre.
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");Beágyazott fájlok felsorolása és kinyerése
Document.EmbeddedFiles egy EmbeddedFileCollection, amelyet felsorolhat. Minden bejegyzés egy FileSpecification, és a GetData() visszaadja a melléklet nyers bájtjait.
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);
}
}Mellékletek keresése, ellenőrzése és eltávolítása
Használja a FindByName-t egyetlen melléklet kereséséhez, a Params-t a metaadatok olvasásához, és a Delete/DeleteByKey-t az eltávolításhoz.
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");Tippek és bevált gyakorlatok
- Előnyben részesítse a
OptimizedMemoryStream-t aMemoryStream-vel szemben, ha egy memóriában lévő dokumentum meghaladhatja a 2GB-ot – aMemoryStreamkivételt dob, amint az egyetlen háttér tömbje eléri ezt a határt. - Felszabadítja a
FileSpecificationpéldányokat (és minden adatfolyamot, amelyet kézzel nyitott meg azokhoz) –FileSpecificationmegvalósítja aIDisposable. - Ellenőrizze a
Document.HasEmbeddedFiles-t, mielőtt végig iterálna aEmbeddedFiles-n, hogy kihagyja a felesleges felsorolást a mellékletek nélküli dokumentumokon. - Állítsa be a
MimeTypeés aAFRelationshipértékeket mindenFileSpecification-n, hogy a downstream PDF fogyasztók helyesen osztályozhassák a mellékleteket. - Használja a
EmbeddedFileCollection.FindByName-t egyetlen név szerinti kereséshez a kézi ciklus írása helyett.
Gyakori problémák
| Probléma | Ok | Javítás |
|---|---|---|
OutOfMemoryException nagy dokumentum mentése egy adatfolyamra | MemoryStream egyetlen ~2GB méretű háttér tömbre korlátozódik | Mentse inkább a OptimizedMemoryStream helyre |
FileSpecification.GetData() üres tömböt ad vissza | A forrás adatfolyam pozíciója nem lett visszaállítva, mielőtt a FileSpecification létrejött | Állítsa be a streamet a 0 pozícióra (vagy nyissa meg újra), mielőtt átadná a FileSpecification számára |
EmbeddedFiles.FindByName visszaad null | A csatolmány neve nem egyezik pontosan (a keresés névre alapozott) | Iterálja a doc.EmbeddedFiles, és hasonlítsa össze a Name értékeket, vagy ellenőrizze a Keys |
| A csatolmány törlése a rossz bejegyzést távolítja el | Több csatolmány is ugyanazzal a névvel rendelkezik | Használja a DeleteByKey-t a Keys pontos kulcsával a félreérthetetlen eltávolításhoz |
FAQ
Mi a különbség a MemoryStream és a OptimizedMemoryStream között?
MemoryStream az adatokat egyetlen folytonos tömbben tárolja, amely körülbelül 2GB-ig terjed. OptimizedMemoryStream ehelyett rögzített méretű darabokban tárolja az adatokat, így túllépheti ezt a határt – hasznos Document.Save műveletekhez, amelyek teljesen memóriában történnek nagyon nagy fájlokon.
Beágyazhatok egy fájlt anélkül, hogy először egy byte[]-ba tölteném?
Igen. FileSpecification(stream, name, description) közvetlenül elfogad egy Stream-t, így beágyazhat File.OpenRead(...)-ből vagy bármely más adatfolyamból anélkül, hogy saját maga pufferelné a memóriába.
Hogyan tudok egy beágyazott fájlt visszakapni egy dokumentumból?
Iterálja a doc.EmbeddedFiles elemeit, és hívja meg a GetData() metódust minden FileSpecification-n, hogy lekérje a nyers bájtokat.
A EmbeddedFileCollection.Delete(name) eltávolítja-e az összes azonos nevű mellékletet?
Nem – pontosan egy mellékletet célozzon meg a DeleteByKey segítségével, és a Keys-ből származó konkrét kulcsot, ha több melléklet is ugyanazzal a névvel rendelkezik.
Biztonságos a FileSpecification újrahasználata több dokumentumon keresztül?
Nem. A FileSpecification megvalósítja a IDisposable interfészt, és egyetlen beágyazott fájl adatfolyamot csomagol; hozzon létre új példányt minden melléklethez minden dokumentumban.
API Reference összefoglaló
| Osztály / Metódus | Leírás |
|---|---|
OptimizedMemoryStream | Növelhető memóriában lévő adatfolyam, amely meghaladja a MemoryStream 2GB-os korlátot |
OptimizedMemoryStream.Write | Írja a bájtokat a pufferbe |
OptimizedMemoryStream.ToArray | Visszaadja a pufferelt bájtokat bájt tömbként |
FileSpecification | Beágyazott fájlcsatolás leíró, amely egy adatfolyam vagy bájt adat alapján működik |
FileSpecification.GetData | A beágyazott fájl nyers bájtjainak lekérése |
FileSpecification.Params | Metaadatok (méret, ellenőrzőösszeg, dátumok) a beágyazott fájlhoz |
EmbeddedFileCollection | A FileSpecification mellékletek gyűjteménye egy Document esetében |
EmbeddedFileCollection.FindByName | Melléklet keresése név szerint |
EmbeddedFileCollection.Delete | Csatolmány eltávolítása név szerint |
Document.AddEmbeddedFile | Kényelmi metódus egy fájl beágyazásához nyers bájtokból |
Document.EmbeddedFiles | A dokumentum beágyazott fájlgyűjteménye |
Document.HasEmbeddedFiles | Azt jelzi, hogy a dokumentum tartalmaz-e beágyazott fájlokat |
FileParams | Csomagolja a méret/ellenőrzőösszeg/dátum metaadatokat egy beágyazott fájlfolyamhoz |