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 | Maksimal backing-memory-kapacitet for hver intern gemnings-butik, før den spiller; standard er 64 MiB |
| SaveTemporaryDirectory | Eksisterende mappe, der bruges til spill-filer; en tom værdi bruger processens midlertidige mappe |
| LastSaveSpillCount | Antal interne arbejdsbutikker, der spillede under den seneste gemnings-pipeline |
| LastSaveLargestMemoryBuffer | Største enkelte backing-memory-kapacitet observeret under den seneste gemnings-pipeline |
TPdfRandomAccessStore nedarver fra TStream og understøtter normale sekventielle læsninger, skrivninger, seeks og dimensionering ud over markøruafhængig positioneret I/O
Data forbliver i en dynamisk dimensioneret hukommelsesbuffer, mens dens logiske ende holder sig på eller under MemoryLimit
Den første operation, der krydser loftet, opretter en eksklusiv midlertidig fil, kopierer de eksisterende bytes én gang, skrubber hukommelsesbufferen og beholder filbackendet i resten af lagerets levetid
Det midlertidige handle bruger delete-on-close- og random-access-flag, tillader ingen deling og fjernes ved normal destruktion eller konstruktor-tilbagerulning
Individuelle operationer serialiseres af en intern kritisk sektion; ReadAt og WriteAt foretrækkes, når samtidige kaldere ikke må konkurrere om den sekventielle markør
Et lager kan sendes direkte til LoadCustomDocument; PDFium-blokcallbacks bruger positionerede læsninger og ændrer ikke lagermarkøren
TPdf bruger den konfigurerede politik til kerne-gemninger, ethvert saved-PDF-postprocessing-workspace og mellemliggende standards-konvertering, validering, kryptering, DSS og PAdES-staging
Native inkrementel xref-stream-reparation læser fixed-size tail- og ordbogsvinduer og anvender derefter validerede ændringer, mens uændrede områder kopieres i afgrænsede chunks
MemoryBytes rapporterer backing-buffer-kapacitet frem for logisk indholdsstørrelsePeakMemoryBytes overstiger aldrig MemoryLimitLastSaveLargestMemoryBuffer er den største enkelte interne butik, ikke summen af samtidigt aktive butikkerTBytes, der stadig oprettes af en bestemt parser, kompressor, validator eller signerMemoryLimit skal være mellem nul og High(Integer)FPDF_FILEACCESS-ABI beholder sin 4 GiB-file length-grænse, selv når backing-butikken selv har en større Int64-størrelseTemporaryFileName er kun diagnostisk; den levende fil er ekklusivt åbnet og må ikke genåbnes af kalderen
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;