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 | Kunkin sisäisen tallennustaustamuistin enimmäiskapasiteetti ennen levylle siirtoa; oletus on 64 MiB |
| SaveTemporaryDirectory | Olemassa oleva hakemisto, jota käytetään siirtotiedostoille; tyhjä arvo käyttää prosessin väliaikaishakemistoa |
| LastSaveSpillCount | Niiden sisäisten työmuistien määrä, jotka siirtyivät levylle viimeisimmän tallennusputken aikana |
| LastSaveLargestMemoryBuffer | Suurin yksittäinen taustamuistikapasiteetti, joka havaittiin viimeisimmän tallennusputken aikana |
TPdfRandomAccessStore on TStream-luokan aliluokka ja tukee tavallisten peräkkäisten lukujen, kirjoitusten, hakujen ja koonmuutosten lisäksi kurssiriippumattomia positioituja I/O-operaatioita
Data pysyy dynaamisesti kasvavassa muistipuskurissa, kunhan sen looginen loppu pysyy MemoryLimit-rajan alapuolella tai tasalla
Ensimmäinen katon ylittävä operaatio luo yksinoikeudellisen väliaikaistiedoston, kopioi olemassa olevat tavut kerran, tyhjentää muistipuskurin ja pitää tiedostotaustan käytössä tallennuksen loppuiän ajan
Väliaikainen kahva käyttää delete-on-close- ja satunnaiskäyttölippuja, ei salli jakamista ja poistetaan normaalissa tuhoamisessa tai konstruktorin peruutuksessa
Yksittäiset operaatiot sarjoitetaan sisäisellä kriittisellä osalla; ReadAt- ja WriteAt-kutsut ovat suositellut, kun rinnakkaiset kutsujat eivät saa kilpailla peräkkäisestä kurssorista
Tallennus voidaan antaa suoraan LoadCustomDocument-kutsulle; PDFiumin lohkopalauteet käyttävät positioituja lukuja eivätkä muuta tallennuksen kurssoria
TPdf käyttää määritettyä käytäntöä perustallennuksiin, jokaiseen tallennetun PDF:n jälkikäsittelytyötilaan sekä välivaiheisiin standardsisällön muunnoissa, validoinneissa, salauksissa sekä DSS- ja PAdES-välityksissä
Natiivi inkrementaalinen xref-virran korjaus lukee kiinteän kokoisia häntä- ja sanakirjaikkunoita ja soveltaa validoidut muutokset kopioidessaan muuttumattomia alueita rajatuissa osissa
MemoryBytes raportoi taustapuskurin kapasiteetin, ei loogista sisällön kokoaPeakMemoryBytes ei koskaan ylitä MemoryLimit-arvoaLastSaveLargestMemoryBuffer on suurin yksittäinen sisäinen tallennus, ei samanaikaisesti aktiivisten tallennusten summaTBytes-rakenteet, joita tietyt jäsennys-, pakkaus-, validointi- tai allekirjoitusosat yhä luovatMemoryLimit-arvon on oltava nollan ja High(Integer)-arvon välissäFPDF_FILEACCESS-ABI säilyttää 4 GiB:n tiedostopituusrajan, vaikka taustatallennuksella itsellään olisi suurempi Int64-kokoTemporaryFileName on vain diagnostinen; avoin tiedosto on yksinomaisesti varattu, eikä kutsuja saa avata sitä uudelleen
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;