Ροές και συνημμένα αρχείων

Ροές και συνημμένα αρχείων

Ροές και Συνημμένα Αρχεία

Πέρα από τις βασικές υπερφορτώσεις Document.Open/Document.Save, το Aspose.PDF FOSS για .NET σας προσφέρει πιο ακριβή έλεγχο του πώς τα byte κινούνται μέσα και έξω από ένα έγγραφο – επεκτάσιμα buffers στη μνήμη για πολύ μεγάλα αρχεία, και ένα αφιερωμένο API για την ενσωμάτωση, την επιθεώρηση και την εξαγωγή συνημμένων αρχείων μέσω FileSpecification και EmbeddedFileCollection.


Δημιουργία buffers στη μνήμη πέρα από 2 GB

MemoryStream αποθηκεύει τα δεδομένα του σε έναν ενιαίο συνεχόμενο πίνακα, που φτάνει σχεδόν τα 2 GB. OptimizedMemoryStream αποθηκεύει τα δεδομένα σε τμήματα σταθερού μεγέθους αντ’ αυτού, ώστε να μπορεί να διαχειριστεί πολύ μεγαλύτερα έγγραφα όταν αποθηκεύετε ή δημιουργείτε ένα PDF εξ ολοκλήρου στη μνήμη.

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}");

Μπορείτε επίσης να γράψετε σε αυτό απευθείας, με τον ίδιο τρόπο που θα το κάνατε με οποιοδήποτε Stream:

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);

Ενσωμάτωση αρχείου απευθείας από μια ροή

FileSpecification μπορεί να τυλίξει ένα Stream αντί να απαιτεί να αποθηκεύσετε το συνημμένο σε ένα byte[] πρώτα. Αυτό είναι χρήσιμο όταν η πηγή του συνημμένου είναι ίδια μια ροή, όπως ένα ανοιχτό χειριστή αρχείου.

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");

Ενσωμάτωση αρχείου από ακατέργαστα bytes

Document.AddEmbeddedFile είναι μια μέθοδος ευκολίας για την ενσωμάτωση αρχείου απευθείας από έναν πίνακα byte, χωρίς να δημιουργηθεί άμεσα ένα FileSpecification.

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");

Απαρίθμηση και εξαγωγή ενσωματωμένων αρχείων

Document.EmbeddedFiles είναι ένα EmbeddedFileCollection που μπορείτε να απαριθμήσετε. Κάθε καταχώρηση είναι ένα FileSpecification, και το GetData() επιστρέφει τα ακατέργαστα 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);
    }
}

Εύρεση, έλεγχος και αφαίρεση συνημμένων

Χρησιμοποιήστε το FindByName για να αναζητήσετε ένα μοναδικό συνημμένο, το Params για να διαβάσετε τα μεταδεδομένα του, και τα Delete/DeleteByKey για να το αφαιρέσετε.

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");

Συμβουλές και βέλτιστες πρακτικές

  • Προτιμήστε το OptimizedMemoryStream αντί του MemoryStream όποτε ένα έγγραφο στη μνήμη μπορεί να υπερβεί τα 2GB – το MemoryStream ρίχνει εξαίρεση όταν η μοναδική πίσω σειρά του φθάνει σε αυτό το όριο.
  • Αποδεσμεύστε τις περιπτώσεις FileSpecification (και οποιοδήποτε ρεύμα ανοίξατε χειροκίνητα γι’ αυτές) – το FileSpecification υλοποιεί το IDisposable.
  • Ελέγξτε το Document.HasEmbeddedFiles πριν διατρέξετε το EmbeddedFiles για να παραλείψετε περιττή απαρίθμηση σε έγγραφα χωρίς συνημμένα.
  • Ορίστε τα MimeType και AFRelationship σε κάθε FileSpecification ώστε οι downstream καταναλωτές PDF να μπορούν να ταξινομήσουν τα συνημμένα σωστά.
  • Χρησιμοποιήστε το EmbeddedFileCollection.FindByName για μια ενιαία ονομαστική αναζήτηση αντί να γράψετε έναν χειροκίνητο βρόχο.

Κοινά προβλήματα

ΠρόβλημαΑιτίαΔιόρθωση
OutOfMemoryException αποθήκευση μεγάλου εγγράφου σε ροήMemoryStream περιορίζεται σε έναν μοναδικό πίνακα ~2GBΑποθηκεύστε στο OptimizedMemoryStream αντί
FileSpecification.GetData() επιστρέφει έναν κενό πίνακαΗ θέση της πηγαίας ροής δεν επαναφέρθηκε πριν δημιουργηθεί το FileSpecificationΚάντε seek στο stream στη θέση 0 (ή ανοίξτε το ξανά) πριν το περάσετε στο FileSpecification
EmbeddedFiles.FindByName επιστρέφει nullΤο όνομα του συνημμένου δεν ταιριάζει ακριβώς (η αναζήτηση βασίζεται σε όνομα)Επαναλάβετε doc.EmbeddedFiles και συγκρίνετε τις τιμές του Name, ή ελέγξτε το Keys
Η διαγραφή ενός συνημμένου αφαιρεί το λάθος στοιχείοΠολλά συνημμένα μοιράζονται το ίδιο όνομαΧρησιμοποιήστε το DeleteByKey με το ακριβές κλειδί από το Keys για σαφή αφαίρεση

FAQ

Ποια είναι η διαφορά μεταξύ MemoryStream και OptimizedMemoryStream;

MemoryStream αποθηκεύει τα byte του σε έναν συνεχόμενο πίνακα που περιορίζεται περίπου στα 2GB. Το OptimizedMemoryStream αποθηκεύει τα δεδομένα σε τμήματα σταθερού μεγέθους αντί για αυτό, ώστε να μπορεί να ξεπεράσει αυτό το όριο — χρήσιμο για λειτουργίες Document.Save που εκτελούνται εξ ολοκλήρου στη μνήμη σε πολύ μεγάλα αρχεία.

Μπορώ να ενσωματώσω ένα αρχείο χωρίς πρώτα να το φορτώσω σε ένα byte[];

Ναι. FileSpecification(stream, name, description) δέχεται ένα Stream απευθείας, έτσι ώστε να μπορείτε να ενσωματώσετε από File.OpenRead(...) ή οποιαδήποτε άλλη ροή χωρίς να το αποθηκεύετε σε μνήμη εσείς.

Πώς μπορώ να εξάγω ένα ενσωματωμένο αρχείο από ένα έγγραφο;

Επανάληψη του doc.EmbeddedFiles και κλήση του GetData() σε κάθε FileSpecification για να ανακτήσετε τα ακατέργαστα byte.

Η μέθοδος EmbeddedFileCollection.Delete(name) αφαιρεί κάθε συνημμένο με αυτό το όνομα;

Όχι — στοχεύστε ένα συγκεκριμένο συνημμένο με το DeleteByKey και το συγκεκριμένο κλειδί από το Keys εάν πολλά συνημμένα έχουν το ίδιο όνομα.

Είναι το FileSpecification ασφαλές για επαναχρησιμοποίηση σε πολλά έγγραφα;

Όχι. Το FileSpecification υλοποιεί το IDisposable και τυλίγει ένα μόνο ρεύμα ενσωματωμένου αρχείου· δημιουργήστε μια νέα παρουσία ανά συνημμένο ανά έγγραφο.


API Reference Σύνοψη

Κλάση / ΜέθοδοςΠεριγραφή
OptimizedMemoryStreamΡοή στη μνήμη με δυνατότητα επέκτασης που υπερβαίνει το όριο των 2GB του MemoryStream
OptimizedMemoryStream.WriteΓράψτε bytes στο buffer
OptimizedMemoryStream.ToArrayΕπιστρέψτε τα buffered bytes ως byte array
FileSpecificationEmbedded file attachment descriptor, με υποστήριξη stream ή byte data
FileSpecification.GetDataΑνακτήστε τα ακατέργαστα bytes ενός ενσωματωμένου αρχείου
FileSpecification.ParamsΜεταδεδομένα (μέγεθος, άθροισμα ελέγχου, ημερομηνίες) για το ενσωματωμένο αρχείο
EmbeddedFileCollectionΣυλλογή FileSpecification συνημμένων σε ένα Document
EmbeddedFileCollection.FindByNameΑναζήτηση ενός συνημμένου με όνομα
EmbeddedFileCollection.DeleteΑφαίρεση ενός συνημμένου με όνομα
Document.AddEmbeddedFileΒολική μέθοδος για ενσωμάτωση αρχείου από ακατέργαστα bytes
Document.EmbeddedFilesΗ συλλογή ενσωματωμένων αρχείων εγγράφου
Document.HasEmbeddedFilesΕάν το έγγραφο περιέχει ενσωματωμένα αρχεία
FileParamsΠεριβάλλει μεταδεδομένα μεγέθους/αθροίσματος ελέγχου/ημερομηνίας για μια ροή ενσωματωμένου αρχείου

Δείτε επίσης

 Ελληνικά