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 | Maximale backing-memorycapaciteit van elke interne save store voordat die overloopt; standaard 64 MiB |
| SaveTemporaryDirectory | Bestaande directory die voor spill-bestanden wordt gebruikt; een lege waarde gebruikt de tijdelijke directory van het proces |
| LastSaveSpillCount | Aantal interne working stores die tijdens de meest recente save-pipeline zijn overgelopen |
| LastSaveLargestMemoryBuffer | Grootste enkele backing-memorycapaciteit gemeten tijdens de meest recente save-pipeline |
TPdfRandomAccessStore is afgeleid van TStream en ondersteunt naast cursoronafhankelijke gepositioneerde I/O ook normale sequentiële reads, writes, seeks en resizing
De data blijft in een dynamisch meegroeiende geheugenbuffer zolang het logische einde op of onder MemoryLimit blijft
De eerste bewerking die de grens overschrijdt maakt een exclusief tijdelijk bestand aan, kopieert de bestaande bytes één keer, wist de geheugenbuffer en houdt de file-backend aan voor de rest van de levensduur van de store
De tijdelijke handle gebruikt delete-on-close- en random-access-flags, staat geen sharing toe en wordt verwijderd bij normale destructie of constructor-rollback
Individuele bewerkingen worden geserialiseerd door een interne critical section; ReadAt en WriteAt verdienen de voorkeur wanneer gelijktijdige aanroepers niet om de sequentiële cursor mogen concurreren
Een store kan rechtstreeks aan LoadCustomDocument worden doorgegeven; PDFium-blockcallbacks gebruiken gepositioneerde reads en wijzigen de store-cursor niet
TPdf gebruikt het geconfigureerde beleid voor core saves, elke saved-PDF-postprocessing-werkruimte en tussentijdse standards conversion, validatie, versleuteling, DSS en PAdES-staging
Native incrementele xref-stream-reparatie leest vaste tail- en dictionary-windows en past daarna gevalideerde edits toe terwijl ongewijzigde bereiken in begrensde chunks worden gekopieerd
MemoryBytes rapporteert de capaciteit van de backing-buffer in plaats van de logische contentgroottePeakMemoryBytes overschrijdt nooit MemoryLimitLastSaveLargestMemoryBuffer is de grootste enkele interne store, niet de som van gelijktijdig actieve storesTBytes die nog steeds door een specifieke parser, compressor, validator of signer worden aangemaaktMemoryLimit moet tussen nul en High(Integer) liggenFPDF_FILEACCESS-ABI behoudt zijn 4 GiB-bestandslengtelimiet, zelfs wanneer de backing store zelf een grotere Int64-grootte heeftTemporaryFileName is uitsluitend diagnostisch; het actieve bestand is exclusief geopend en mag niet door de aanroeper worden heropend
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;