Ροές και συνημμένα αρχείων
Ροές και Συνημμένα Αρχεία
Πέρα από τις βασικές υπερφορτώσεις 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 |
FileSpecification | Embedded 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 | Περιβάλλει μεταδεδομένα μεγέθους/αθροίσματος ελέγχου/ημερομηνίας για μια ροή ενσωματωμένου αρχείου |