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 | Taşmadan önce her iç kayıt deposunun azami destek belleği kapasitesi; varsayılan 64 MiB |
| SaveTemporaryDirectory | Taşma dosyaları için kullanılan mevcut dizin; boş değer işlem geçici dizinini kullanır |
| LastSaveSpillCount | En son kayıt hattı sırasında taşan iç çalışma depolarının sayısı |
| LastSaveLargestMemoryBuffer | En son kayıt hattı sırasında gözlemlenen en büyük tek destek belleği kapasitesi |
TPdfRandomAccessStore, TStream sınıfından türetilir ve imleçten bağımsız konumlu G/Ç'nin yanı sıra normal sıralı okuma, yazma, arama (seek) ve boyutlandırmayı destekler
Mantıksal sonu MemoryLimit değerinde veya altında kaldığı sürece veriler dinamik boyutlu bir bellek arabelleğinde kalır
Üst sınırı aşan ilk işlem özel kullanımlık bir geçici dosya oluşturur, mevcut baytları bir kez kopyalar, bellek arabelleğini temizler ve depo ömrünün geri kalanı için dosya arka ucunu kullanır
Geçici dosya tanıtıcısı kapanışta-sil ve rastgele erişim bayraklarını kullanır, hiçbir paylaşıma izin vermez ve normal yıkımda ya da kurucu geri almasında kaldırılır
Tek tek işlemler içsel bir kritik bölüm ile serileştirilir; eşzamanlı çağıranların sıralı imleç için rekabet etmemesi gerektiğinde ReadAt ve WriteAt tercih edilir
Bir depo doğrudan LoadCustomDocument işlevine geçirilebilir; PDFium blok geri çağrıları konumlu okumalar kullanır ve depo imlecini değiştirmez
TPdf, yapılandırılmış ilkeyi çekirdek kayıtlar, kaydedilen her PDF son işleme çalışma alanı ve ara standart dönüştürme, doğrulama, şifreleme, DSS ve PAdES hazırlama aşamalarında kullanır
Yerel artımlı xref akışı onarımı sabit boyutlu kuyruk ve sözlük pencerelerini okur, ardından doğrulanmış düzenlemeleri sınırlı parçalar hâlinde değişmeyen aralıkları kopyalayarak uygular
MemoryBytes, mantıksal içerik boyutunu değil destek arabelleği kapasitesini raporlarPeakMemoryBytes hiçbir zaman MemoryLimit değerini aşamazLastSaveLargestMemoryBuffer, eşzamanlı etkin depoların toplamı değil en büyük tek iç depodurTBytes değerlerini kapsamazMemoryLimit sıfır ile High(Integer) arasında olmalıdırFPDF_FILEACCESS ABI'si, destek deposunun kendisi daha büyük bir Int64 boyutuna sahip olsa bile 4 GiB dosya uzunluğu sınırını korurTemporaryFileName yalnızca tanısal amaçlıdır; canlı dosya özel olarak açılmıştır ve çağıran tarafından yeniden açılmamalıdır
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;