const PdfDefaultStorageMemoryLimit = 64 * 1024 * 1024;
type TPdfStorageBackend = (psbMemory, psbTemporaryFile);
constructor TPdfRandomAccessStore.Create(AMemoryLimit: Int64 = PdfDefaultStorageMemoryLimit; const ATemporaryDirectory: string = '');
destructor Destroy; override;
function Read(var Buffer; Count: Longint): Longint; override;
function Seek(Offset: Int64; Origin: TSeekOrigin): Int64; override;
function Write(const Buffer; Count: Longint): Longint; override;
function ReadAt(Offset: Int64; var Buffer; Count: Longint): Longint;
function WriteAt(Offset: Int64; const Buffer; Count: Longint): Longint;
procedure CopyToStream(Destination: TStream; BufferSize: Integer = 1048576);
procedure Flush;
procedure SpillToDisk;
property Backend: TPdfStorageBackend;
property MemoryBytes: Int64;
property MemoryLimit: Int64;
property PeakMemoryBytes: Int64;
property Spilled: Boolean;
property TemporaryDirectory: string;
property TemporaryFileName: string;
property SaveMemoryLimit: Int64;
property SaveTemporaryDirectory: string;
property LastSaveSpillCount: Integer;
property LastSaveLargestMemoryBuffer: Int64;
| SaveMemoryLimit | السعة القصوى لذاكرة السند لكل مخزن حفظ داخلي قبل أن يُفرَّغ؛ والافتراضي 64 MiB |
| SaveTemporaryDirectory | دليل موجود يُستخدم لملفات التفريغ؛ والقيمة الفارغة تستخدم دليل الملفات المؤقتة للعملية |
| LastSaveSpillCount | عدد المخازن الداخلية العاملة التي فُرِّغت خلال خط أنابيب الحفظ الأخير |
| LastSaveLargestMemoryBuffer | أكبر سعة ذاكرة سند مفردة لوحظت خلال خط أنابيب الحفظ الأخير |
تشتق TPdfRandomAccessStore من TStream وتدعم القراءات والكتابات والتنقلات التسلسلية العادية وتحديد الحجم، إضافة إلى إدخال/إخراج موضعي مستقل عن المؤشر
تبقى البيانات في مخزن ذاكرة متغير الحجم ما دامت نهايتها المنطقية عند MemoryLimit أو دونه
تنشئ أول عملية تعبر سقفَ الحد ملفًا مؤقتًا حصريًا، وتنسخ البايتات الموجودة مرة واحدة، وتمسح مخزن الذاكرة، وتُبقي الخلفية الملفية لبقية عمر المخزن
يستخدم المقبض المؤقت رايتي الحذف عند الإغلاق والوصول العشوائي، ولا يسمح بأي مشاركة، ويُزال عند التدمير العادي أو التراجع عن الباني
تُسلسَل العمليات الفردية بقسمة حرجة داخلية؛ وتُفضَّل ReadAt و WriteAt عندما يجب ألا يتنافس المستدعون المتزامنون على المؤشر التسلسلي
يمكن تمرير المخزن مباشرة إلى LoadCustomDocument؛ وتستخدم استدعاءات كتل PDFium قراءات موضعية لا تغيّر مؤشر المخزن
تستخدم TPdf السياسة المضبوطة للحفظ الأساسي ولمساحة عمل المعالجة اللاحقة لكل PDF محفوظ وللتجهيز الوسيط لتحويل المعايير والمصادقة والتعمية و DSS و PAdES
تقرأ إصلاح تدفقات xref التزايدي الأصلي نوافذَ ذيلٍ وقواميس ثابتة الحجم، ثم تطبق التحريرات المتحقق منها أثناء نسخ المديات غير المتغيرة على دفعات محدودة
MemoryBytes يُبلِّغ عن سعة مخزن السند لا عن حجم المحتوى المنطقيPeakMemoryBytes لا يتجاوز MemoryLimit أبدًاLastSaveLargestMemoryBuffer هو أكبر مخزن داخلي مفرد، لا مجموع المخازن النشطة في آنٍ واحدTBytes المؤقتة التي ما يزال ينشئها محلل أو ضاغط أو مُصادق أو موقِّع بعينهMemoryLimit بين الصفر و High(Integer)FPDF_FILEACCESS العام في Windows على حد طول ملف قدره 4 GiB حتى عندما يكون حجم مخزن السند نفسه أكبر بنوع Int64TemporaryFileName للتشخيص فقط؛ فالملف الحي مفتوح حصريًا ويجب ألا يعيد المستدعي فتحه
var
Store: TPdfRandomAccessStore;
begin
Pdf.SaveMemoryLimit := 16 * 1024 * 1024;
Pdf.SaveTemporaryDirectory := TPath.GetTempPath;
Pdf.SaveAs('output.pdf');
Log(Pdf.LastSaveSpillCount, Pdf.LastSaveLargestMemoryBuffer);
Store := TPdfRandomAccessStore.Create(4 * 1024 * 1024);
try
Store.CopyFrom(SourceStream, SourceStream.Size);
Store.Position := 0;
Pdf.LoadCustomDocument(Store, False);
finally
Pdf.Active := False;
Store.Free;
end;
end;