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 | 내부 저장소마다 넘치기 전까지 허용되는 백킹 메모리 용량의 최댓값이며 기본값은 64 MiB입니다 |
| SaveTemporaryDirectory | 넘친 파일이 쓰이는 기존 디렉터리이며 빈 값은 프로세스 임시 디렉터리를 사용합니다 |
| LastSaveSpillCount | 가장 최근 저장 파이프라인에서 넘친 내부 작업 저장소의 개수입니다 |
| LastSaveLargestMemoryBuffer | 가장 최근 저장 파이프라인에서 관찰된 단일 백킹 메모리 용량의 최댓값입니다 |
TPdfRandomAccessStore는 TStream을 상속하며 커서와 무관한 위치 지정 I/O 외에 일반적인 순차 읽기, 쓰기, 탐색, 크기 조정을 지원합니다
데이터는 논리적 끝이 MemoryLimit 이하인 동안 동적으로 크기가 조정되는 메모리 버퍼에 머뭅니다
상한을 넘는 첫 연산이 배타적인 임시 파일을 만들고 기존 바이트를 한 번 복사한 뒤 메모리 버퍼를 지우고, 저장소 수명이 끝날 때까지 파일 백엔드를 유지합니다
임시 핸들은 delete-on-close와 random-access 플래그를 사용하고 공유를 허용하지 않으며 정상적인 파괴나 생성자 롤백에서 제거됩니다
개별 연산은 내부 critical section으로 직렬화됩니다. 동시 호출자가 순차 커서를 두고 경쟁하면 안 될 때는 ReadAt과 WriteAt이 권장됩니다
저장소는 LoadCustomDocument에 바로 전달할 수 있고 PDFium 블록 콜백은 위치 지정 읽기를 사용하므로 저장소 커서를 바꾸지 않습니다
TPdf는 구성된 정책을 코어 저장, 저장된 PDF 후처리 작업 공간 전체, 중간 단계의 표준 변환, 검증, 암호화, DSS, PAdES 스테이징에 사용합니다
네이티브 증분 xref 스트림 복구는 고정 크기의 꼬리와 딕셔너리 창을 읽은 다음, 변경되지 않은 범위를 한도 있는 청크로 복사하면서 검증된 편집을 적용합니다
MemoryBytes는 논리적 내용 크기가 아니라 백킹 버퍼 용량을 보고합니다PeakMemoryBytes는 MemoryLimit를 넘지 않습니다LastSaveLargestMemoryBuffer는 동시에 활성인 저장소들의 합이 아니라 가장 큰 단일 내부 저장소입니다TBytes는 포함되지 않습니다MemoryLimit은 0부터 High(Integer) 사이여야 합니다FPDF_FILEACCESS ABI는 백킹 저장소 자체가 더 큰 Int64 크기를 가져도 4 GiB 파일 길이 한도를 그대로 유지합니다TemporaryFileName은 진단용일 뿐입니다. 살아 있는 파일은 배타적으로 열려 있으며 호출자가 다시 열어서는 안 됩니다
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;