Adatfolyamok és Fájlcsatolmányok

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 a MemoryStream-vel szemben, ha egy memóriában lévő dokumentum meghaladhatja a 2GB-ot – a MemoryStream kivételt dob, amint az egyetlen háttér tömbje eléri ezt a határt.
  • Felszabadítja a FileSpecification példányokat (és minden adatfolyamot, amelyet kézzel nyitott meg azokhoz) – FileSpecification megvalósítja a IDisposable.
  • Ellenőrizze a Document.HasEmbeddedFiles-t, mielőtt végig iterálna a EmbeddedFiles-n, hogy kihagyja a felesleges felsorolást a mellékletek nélküli dokumentumokon.
  • Állítsa be a MimeType és a AFRelationship értékeket minden FileSpecification-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émaOkJavítás
OutOfMemoryException nagy dokumentum mentése egy adatfolyamraMemoryStream egyetlen ~2GB méretű háttér tömbre korlátozódikMentse inkább a OptimizedMemoryStream helyre
FileSpecification.GetData() üres tömböt ad visszaA 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 nullA 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 elTöbb csatolmány is ugyanazzal a névvel rendelkezikHaszná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ódusLeírás
OptimizedMemoryStreamNövelhető memóriában lévő adatfolyam, amely meghaladja a MemoryStream 2GB-os korlátot
OptimizedMemoryStream.WriteÍrja a bájtokat a pufferbe
OptimizedMemoryStream.ToArrayVisszaadja a pufferelt bájtokat bájt tömbként
FileSpecificationBeágyazott fájlcsatolás leíró, amely egy adatfolyam vagy bájt adat alapján működik
FileSpecification.GetDataA beágyazott fájl nyers bájtjainak lekérése
FileSpecification.ParamsMetaadatok (méret, ellenőrzőösszeg, dátumok) a beágyazott fájlhoz
EmbeddedFileCollectionA FileSpecification mellékletek gyűjteménye egy Document esetében
EmbeddedFileCollection.FindByNameMelléklet keresése név szerint
EmbeddedFileCollection.DeleteCsatolmány eltávolítása név szerint
Document.AddEmbeddedFileKényelmi metódus egy fájl beágyazásához nyers bájtokból
Document.EmbeddedFilesA dokumentum beágyazott fájlgyűjteménye
Document.HasEmbeddedFilesAzt jelzi, hogy a dokumentum tartalmaz-e beágyazott fájlokat
FileParamsCsomagolja a méret/ellenőrzőösszeg/dátum metaadatokat egy beágyazott fájlfolyamhoz

Lásd még:

 Magyar