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 bakminnekapasitet for hver internt lagringsbutikk før den spiller over; standardverdien er 64 MiB |
| SaveTemporaryDirectory | Eksisterende katalog brukt til overspillfiler; en tom verdi bruker prosessens midlertidige katalog |
| LastSaveSpillCount | Antall interne arbeidsbutikker som spilte over under den siste lagringspipelinen |
| LastSaveLargestMemoryBuffer | Største enkelte bakminnekapasitet observert under den siste lagringspipelinen |
TPdfRandomAccessStore stammer fra TStream og støtter normale sekvensielle lesinger, skrivinger, søk og størrelsesendring, i tillegg til posisjonsuavhengig posisjonert I/O
Data forblir i en dynamisk dimensjonert minnebuffer så lenge den logiske enden holder seg på eller under MemoryLimit
Den første operasjonen som krysser taket oppretter en eksklusiv midlertidig fil, kopierer de eksisterende bytene én gang, scrubber minnebufferen og beholder fil-backend-en for resten av butikkens levetid
Det midlertidige håndtaket bruker delete-on-close- og tilfeldig tilgang-flagg, tillater ingen deling, og fjernes ved normal destrukjon eller konstruktør-rullback
Enkeltoperasjoner serialiseres av en intern kritisk seksjon; ReadAt og WriteAt er å foretrekke når samtidige kallere ikke skal konkurrere om den sekvensielle pekeren
En butikk kan sendes rett til LoadCustomDocument; PDFiums blokk-callbacks bruker posisjonerte lesinger og endrer ikke butikkens peker
TPdf bruker den konfigurerte politikken for kjerne-lagring, hvert arbeidsområde for etterbehandling av lagrede PDF-er, og mellomliggende standardskonvertering, validering, kryptering, DSS- og PAdES-klargjøring
Native inkrementell xref-strøm-reparasjon leser vinduer med fast størrelse fra halen og ordbøker, og anvender deretter validerte endringer mens uendrede områder kopieres i avgrensede biter
MemoryBytes rapporterer bakbufferkapasitet, ikke logisk innholdsstørrelsePeakMemoryBytes overskrider aldri MemoryLimitLastSaveLargestMemoryBuffer er den største enkelte interne butikken, ikke summen av samtidig aktive butikkerTBytes som fortsatt opprettes av en bestemt tolk, kompressor, validator eller signererMemoryLimit må være mellom null og High(Integer)FPDF_FILEACCESS-ABI-en beholder sin 4 GiB-grense for fillengde, selv når bakbutikken selv har en større Int64-størrelseTemporaryFileName er kun diagnostisk; den levende filen er eksklusivt åpnet og må ikke åpnes på nytt av kalleren
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;