זרמים וקבצים מצורפים

זרמים וקבצים מצורפים

זרמים וקבצי צרופות

מעבר להעמסת הבסיסית של 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 עבור זרם קובץ משובץ

ראה גם

 עברית