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 | Najveći kapacitet potporne memorije svakog internog spremišta spremanja prije prelijevanja; zadano 64 MiB |
| SaveTemporaryDirectory | Postojeći direktorij koji se koristi za datoteke prelijevanja; prazna vrijednost koristi privremeni direktorij procesa |
| LastSaveSpillCount | Broj internih radnih spremišta koja su se prelila tijekom najnovijeg cjevovoda spremanja |
| LastSaveLargestMemoryBuffer | Najveći zabilježeni kapacitet jedne potporne memorije tijekom najnovijeg cjevovoda spremanja |
TPdfRandomAccessStore izvodi se iz TStream i podržava normalna sekvencijalna očitavanja, upisivanja, pozicioniranja i određivanje veličine, uz pozicionirani I/O neovisan o kursoru
Podaci ostaju u dinamički dimenzioniranom memorijskom međuspremniku dok im logički kraj ostaje na MemoryLimit ili ispod njega
Prva operacija koja prijeđe ograničenje stvara ekskluzivnu privremenu datoteku, jednom kopira postojeće bajtove, čisti memorijski međuspremnik i zadržava pozadinu na datoteci do kraja vijeka spremišta
Privremeni handle koristi zastavice delete-on-close i nasumičnog pristupa, ne dopušta dijeljenje i uklanja se pri normalnom uništavanju ili vraćanju konstruktora
Pojedinačne operacije serijalizira interna kritična sekcija; ReadAt i WriteAt su poželjni kada istodobni pozivatelji ne smiju natjecati se za sekvencijalni kursor
Spremište se može proslijediti izravno u LoadCustomDocument; blok povratni pozivi PDFiuma koriste pozicionirana očitavanja i ne mijenjaju kursor spremišta
TPdf koristi konfiguriranu politiku za osnovna spremanja, svaki radni prostor naknadne obrade spremljenog PDF-a te posredničke pripreme pretvorbe standarda, validacije, šifriranja, DSS-a i PAdES-a
Nativni popravak inkrementalnih xref tokova čita prozore repa i rječnika fiksne veličine, a zatim primjenjuje ovjerene izmjene dok kopira nepromijenjene raspone u ograničenim komadima
MemoryBytes izvješćuje kapacitet potpornog međuspremnika, a ne logičku veličinu sadržajaPeakMemoryBytes nikad ne premašuje MemoryLimitLastSaveLargestMemoryBuffer je najveće pojedinačno interno spremište, a ne zbroj istodobno aktivnih spremištaTBytes koje i dalje stvara određeni parser, kompresor, validator ili potpisnikMemoryLimit mora biti između nule i High(Integer)FPDF_FILEACCESS zadržava svoje ograničenje duljine datoteke od 4 GiB čak i kada samo potporno spremište ima veću Int64 veličinuTemporaryFileName služi samo dijagnostici; živa datoteka otvorena je ekskluzivno i pozivatelj je ne smije ponovno otvoriti
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;