זרמים וקבצים מצורפים
זרמים וקבצי צרופות
מעבר להעמסת הבסיסית של Document.Open/Document.Save, Aspose.PDF FOSS ל-.NET נותן לך שליטה מדויקת יותר על האופן שבו בתים נעים פנימה והחוצה ממסמך – מאגרי זיכרון ניתנים להרחבה לקבצים גדולים מאוד, ו-API ייעודי להטמעה, בחינה והוצאת קבצי צרופות דרך FileSpecification ו-EmbeddedFileCollection.
הרחבת מאגרי זיכרון מעבר ל-2GB
MemoryStream שומר את הנתונים שלו במערך רציף יחיד, שמסתיים קרוב ל-2GB. 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");הטמעת קובץ מבייטים גולמיים
Document.AddEmbeddedFile היא שיטה נוחה להטמעת קובץ ישירות ממערך בייטים, מבלי לבנות 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() מחזיר את הבייטים הגולמיים של הקובץ המצורף.
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כדי שמקבלי PDF במטה יוכלו לסווג את הקבצים המצורפים כראוי. - השתמש ב-
EmbeddedFileCollection.FindByNameלחיפוש בשם יחיד במקום לכתוב לולאה ידנית.
בעיות נפוצות
| בעיה | סיבה | תיקון |
|---|---|---|
OutOfMemoryException שמירת מסמך גדול לזרם | MemoryStream מוגבל למערך אחורי יחיד של ~2 GB | שמור ל-OptimizedMemoryStream במקום |
FileSpecification.GetData() מחזיר מערך ריק | מיקום הזרם המקור לא אופס לפני ש-FileSpecification נוצר | הזז את הזרם למיקום 0 (או פתח אותו מחדש) לפני העברתו ל FileSpecification |
EmbeddedFiles.FindByName מחזיר null | שם הקובץ המצורף אינו תואם בדיוק (החיפוש מבוסס על שם) | חזור על doc.EmbeddedFiles והשווה ערכי Name, או בדוק את Keys |
| מחיקת קובץ מצורף מוחקת את הרשומה השגויה | מספר קבצים מצורפים חולקים את אותו שם | השתמש ב-DeleteByKey עם המפתח המדויק מ-Keys להסרה ברורה |
FAQ
מה ההבדל בין MemoryStream ל-OptimizedMemoryStream?
MemoryStream שומר את הבייטים שלו במערך רציף אחד עם גבול של כ-2GB. OptimizedMemoryStream שומר את הנתונים בחלקים בגודל קבוע במקום זאת, ולכן הוא יכול לגדול מעבר למגבלה הזו – שימושי עבור פעולות Document.Save המתבצעות כולה בזיכרון על קבצים גדולים מאוד.
האם אני יכול לשלב קובץ מבלי לטעון אותו למערך byte[] קודם?
כן. FileSpecification(stream, name, description) מקבל Stream ישירות, ולכן ניתן לשלב מ-File.OpenRead(...) או מכל זרם אחר מבלי לאגור אותו בזיכרון בעצמך.
איך אני מקבל קובץ משולב חזרה ממסמך?
עבור על doc.EmbeddedFiles וקרא GetData() על כל FileSpecification כדי לקבל את הבייטים הגולמיים.
האם EmbeddedFileCollection.Delete(name) מסיר את כל הקבצים המצורפים עם שם זה?
לא – יש למקד קובץ מצורף אחד בדיוק באמצעות DeleteByKey והמפתח הספציפי מ-Keys אם מספר קבצים מצורפים חולקים את אותו שם.
האם FileSpecification בטוח לשימוש חוזר על פני מסמכים מרובים?
לא. FileSpecification מממש את IDisposable ועוטף זרם קובץ משולב יחיד; יש ליצור מופע חדש לכל קובץ מצורף בכל מסמך.
API Reference סיכום
| מחלקה / מתודה | תיאור |
|---|---|
OptimizedMemoryStream | זרם בזיכרון הניתן להגדלה החורג ממגבלת 2GB של MemoryStream |
OptimizedMemoryStream.Write | כתוב בתים לתוך החוצץ |
OptimizedMemoryStream.ToArray | החזר את הבתים בחוצץ כמערך בתים |
FileSpecification | מתאר קובץ מצורף משולב, מגובה בזרם או בנתוני בתים |
FileSpecification.GetData | קבל את הבייטים הגולמיים של קובץ משולב |
FileSpecification.Params | מטא-נתונים (גודל, סכום ביקורת, תאריכים) עבור הקובץ המשולב |
EmbeddedFileCollection | אוסף של קבצים מצורפים FileSpecification על Document |
EmbeddedFileCollection.FindByName | חפש קובץ מצורף לפי שם |
EmbeddedFileCollection.Delete | הסר קובץ מצורף בשם |
Document.AddEmbeddedFile | מתודה נוחות להטמעת קובץ מבתים גולמיים |
Document.EmbeddedFiles | אוסף הקבצים המוטמעים של המסמך |
Document.HasEmbeddedFiles | האם המסמך מכיל קבצים מוטמעים |
FileParams | עוטף מטא-דאטה של גודל/checksum/date עבור זרם קובץ משובץ |