PDFium Delphi Component API-Referenz

Stapel-Extraktion von Anhängen

Komponente: TPdf  ·  Unit: PDFium
Nimmt eingebettete Anhänge einmal als Bestandsaufnahme und schreibt ihre dekodierten Nutzdaten in Streams im Eigentum des Aufrufers, unter expliziten Ressourcenkontrollen

ReadAttachmentMetadata

function ReadAttachmentMetadata(MaxAttachments: Integer = 10000): TPdfAttachmentMetadataArray;

Die Methode zählt die Anhänge auf Dokumentebene einmal auf und gibt Records im Eigentum des Aufrufers zurück, die Index, Name, Description, MimeType, Relationship, die dekodierte Size und Readable enthalten

MaxAttachments wird geprüft, bevor das Ergebnisarray gefüllt wird, sodass ein nicht vertrauenswürdiges Dokument keine unbegrenzte Metadatenzuweisung auslösen kann

Die Größenabfrage kopiert keine Nutzdaten-Bytes in den Speicher von PDFium Delphi Component, obwohl PDFium intern einen Stream dekodieren kann, um seine dekodierte Länge zu bestimmen

ExtractAttachmentsToStreams

function ExtractAttachmentsToStreams(const Destinations: array of TStream; const Options: TPdfAttachmentBatchOptions; out Report: TPdfAttachmentBatchReport; const CancellationToken: IPdfCancellationToken = nil): Boolean;

Destinations muss genau einen Slot pro Dokumentanhang enthalten und folgt derselben nullbasierten Reihenfolge wie Attachment[Index]

Ein nil-Ziel markiert das Element als paesSkipped, sodass Aufrufer Anhänge ohne zweite Aufzählung auswählen können

Jeder nicht leere Nutzdateninhalt wird durch PDFium in einen temporären Puffer von PDFium Delphi Component dekodiert und dann stückweise in ChunkBytes-Größe aus diesem Puffer geschrieben

Der Puffer wird vor dem nächsten Anhang freigegeben, sodass PDFium Delphi Component den gesamten Stapel nie zurückhält; die öffentliche PDFium-Anhangs-API unterstützt keine Bereichslesevorgänge und kann intern ihren eigenen Voll-Nutzdaten-Dekodierspeicher verwenden

Streams bleiben im Eigentum des Aufrufers, das Schreiben beginnt an der jeweiligen aktuellen Stream-Position, und die Methode spult sie nicht zurück und schneidet sie nicht ab

Ein Abbruch oder eine Ziel-Exception kann Bytes zurücklassen, die bereits in diesen Stream geschrieben wurden; Aufrufer, die transaktionelle Ausgaben benötigen, sollten daher temporäre Streams bereitstellen und diese erst nach einem erfolgreichen Report veröffentlichen

Optionen

FeldStandardBedeutung
MaxAttachments10000Maximale Anzahl an Metadaten- und Report-Einträgen
MaxFileBytes256 MiBMaximale dekodierte Größe eines Anhangs
MaxTotalBytes1 GiBMaximale Byteanzahl, die über alle Ziele hinweg geschrieben wird
ChunkBytes1 MiBMaximale Byteanzahl, die an einen einzigen Stream-Schreibvorgang übergeben wird
StopOnErrorTrueNach dem ersten nicht lesbaren, das Budget überschreitenden oder schreibfehlerhaften Element anhalten

Report

Jeder TPdfAttachmentMetadata-Record beschreibt einen nativen Anhang, und TPdfAttachmentMetadataArray speichert den Metadaten-Schnappschuss

Jeder TPdfAttachmentBatchItem kombiniert Metadaten, einen TPdfAttachmentExtractionState, geschriebene Bytes und Fehlertext, während TPdfAttachmentBatchItems alle Einzelergebnisse speichert

Die TPdfAttachmentExtractionState-Werte sind paesNotProcessed, paesSkipped, paesExtracted, paesUnreadable, paesFileLimit, paesAggregateLimit, paesCancelled und paesWriteFailed

Der TPdfAttachmentBatchReport zählt AttachmentCount, ExtractedCount, SkippedCount und FailedCount sowie BytesWritten und PeakBufferBytes

Completed bedeutet, dass jedes Element einen Endzustand ohne Abbruch erreicht hat, während das Funktionsergebnis zusätzlich FailedCount = 0 verlangt

PeakBufferBytes meldet den größten Nutzdatenpuffer von PDFium Delphi Component und schließt den privaten Speicher nicht ein, den PDFium während der Dekodierung verwendet

Beispiel

var Options: TPdfAttachmentBatchOptions;
var Report: TPdfAttachmentBatchReport;
Options := TPdfAttachmentBatchOptions.Default;
Options.MaxFileBytes := 64 * 1024 * 1024;
Options.MaxTotalBytes := 256 * 1024 * 1024;
if not Pdf1.ExtractAttachmentsToStreams(Destinations, Options, Report) then
  HandleAttachmentBatchFailure(Report);

Siehe auch

Attachment, AttachmentCount, AttachmentDescription, AttachmentName, AttachmentType