PDF-Struktur Lesestrategien

Überblick und Hintergrund

PDF Dokumente können bestimmte Strukturfehler aufweisen. Über die Angabe einer PDF-Lesestrategie können Heuristiken aktiviert werden, um gewisse Strukturfehler automatisch zu korrigieren und somit eine Anzeige des defekten Dokuments ermöglichen.

Hierfür müssen im Reader die PDFStructureReaderSettings gesetzt werden. Die in diesen Einstellungen enthaltene Aufzählung PDFStructureReaderSettings.PDFStructureReadStrategy gibt die Strategie an. Im folgenden Abschnitt werden die möglichen Einstellungen genauer erläutert.

WICHTIG: Es werden Heuristiken angewandt, die Fehler abfangen. Da nicht alle möglichen Fehler vorhersehbar sind, und die Reaktion auf solche Fehler nicht definiert ist, kann nicht bestimmt werden, ob die Anzeige korrekt ist.

Es kann gegebenenfalls Strukturprobleme geben, die von der Heuristik nicht korrekt behandelt werden.

Insbesondere wenn Dokumente in einem Langzeitarchiv abgelegt werden, muss die integrierende Anwendung entscheiden, wie mit solchen Dokumenten umgegangen werden soll. Weitere Hinweise zu diesem Thema im Abschnitt Beispiel 7.31, „Setzen von PDFStructureReaderSettings für das Lesen fehlerhafter Dokumente“.

Desweiteren kann es semantische Fehler im PDF-Datenstrom geben, die zwar syntaktisch fehlerfrei gelesen werden konnten, aber erst bei der späteren Anzeige oder Interpretation zu Fehlern führen.

Aus diesen Gründen sollte diese Funktion nicht verwendet werden, um ein fehlerhaftes Dokument zu »bereinigen«, indem beispielsweise das Dokument mit LENIENT_ON_ERROR zur Anzeige gebracht und dann wieder als PDF exportiert wird.

Existierende Lese-Strategien

Die Lesestrategie kann über die PDFStructureReaderSettings gesetzt werden (enum PDFStructureReaderSettings.PDFStructureReadStrategy):

PDFStructureReaderSettings.PDFStructureReadStrategy.STRICT

Strenger Lesemodus; Fehler in der PDF Struktur führen gegebenenfalls zu Fehlern und Abbruch beim Lesevorgang.

Dieser Modus ist der Standardwert.

PDFStructureReaderSettings.PDFStructureReadStrategy.LENIENT_ON_ERROR

Toleranter Lesemodus. Zunächst wird versucht, das Dokument mit dem strikten Mechanismus (PDFStructureReaderSettings.PDFStructureReadStrategy.STRICT) zu lesen. Wenn hierbei Fehler auftreten, wird je nach Fehler versucht, das Problem zu korrigieren.

Hinsichtlich Performance verhält sich dieser Modus bei fehlerfreien Dokumenten analog dem Lesemodus STRICT. Wenn Strukturfehler im PDF enthalten sind, erhöht sich die Lesedauer, um die Korrekturen anzuwenden.

Dieser Modus ist in Produktionsumfeldern verwendbar, wenn mit strukturell defekten Dokumenten gerechnet werden muss. Bei Behebung von Strukturfehlern werden spezielle Log-Meldungen produziert, die über einen Listener abgefangen werden können. Eine integrierende Anwendung kann so den Benutzer darauf hinweisen, dass bei diesem Dokument eine Korrektur erfolgt ist.

Siehe hierzu auch das Kapitel Beispiel 7.31, „Setzen von PDFStructureReaderSettings für das Lesen fehlerhafter Dokumente“.

PDFStructureReaderSettings.PDFStructureReadStrategy.ALWAYS_GENERATE_XREF

In diesem Modus wird die im PDF enthaltene cross-reference table (Zuordnungstabelle von PDF-Objekten zu ihrem Byte-Offset innerhalb des Datenstroms) ignoriert und immer eine Tabelle generiert, unabhängig davon, ob der PDF Datenstrom tatsächlich Fehler aufweist.

Beim Generieren der cross-reference table wird der komplette Dokument-Datenstrom gelesen und die Positionen der Objekte ermittelt. Dieser Vorgang kann bei großen Dokumenten länger dauern, als das Lesen einer korrekten cross-reference table aus dem PDF. Bei kleinen Dokumenten ist der Unterschied gering.

Der Modus LENIENT_ON_ERROR informiert mittels spezifischer Log-Meldungen darüber, dass es sich um ein defektes Dokument handelt. Diese Meldungen werden bei ALWAYS_GENERATE_XREF nicht produziert, da die Fehler durch die Generierung der cross-reference table gar nicht erst auftreten.

Liste der korrigierbaren Strukturfehler-Arten

Es können die folgenden Arten von Strukturfehlern im Modus LENIENT_ON_ERROR korrigiert werden (im Modus ALWAYS_GENERATE_XREF treten diese Fehler generell nicht auf, da die originale cross-reference table gar nicht gelesen wird).

Im Kapitel Beispiel 7.32, „Behandlung/Erkennung von strukturell defekten Dokumenten“ ist ein Beispiel zur Auswertung und Erkennung von strukturell defekten Dokumenten enthalten.

Falscher cross-reference offset

startxref zeigt nicht auf den Anfang der cross-reference table. Korrektur: Suchen der korrekten Position. Im Modus STRICT erscheint bei diesem Fehler die Fehlermeldung: specified location does not contain a cross reference table.

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.STRUCT-XREF_OFFSET_WRONG

Unzulässiger cross-reference offset

startxref zeigt nicht auf den Anfang der cross-reference table, sondern ist negativ oder größer als die Zeichenzahl im Dokument, verweist also auf eine Position, die es im Dokument nicht gibt. Korrektur: Suchen der korrekten Position.

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.ILLEGAL_XREF_OFFSET

Fehlende oder leere cross-reference table

Wenn die cross-reference table nicht vorhanden oder leer ist, wird die Tabelle generiert.

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.STRUCT-XREF_OFFSET_OR_TABLE_MISSING

Leere cross-reference table

Wenn die cross-reference table leer ist, wird die Tabelle generiert.

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.XREF_EMPTY_USING_GENERATED_REPLACEMENT

Fehler beim Lesen der cross-reference table

Wenn generelle Fehler beim Lesen der cross-reference table auftreten, wird die komplette cross-reference table generiert.

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.STRUCT-STRUCTURE_PARSE_ERROR_USING_GENERATED_XREF

Position der cross-reference table nicht lesbar

Wenn die Position der cross-reference table (startxref) nicht ermittelt werden konnte, wird versucht, die Tabelle zu finden.

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.STRUCT-XREF_OFFSET_WRONG

Mehrere PDF Dokumente im Datenstrom

Wenn auf ein %%EOF ein %PDF-1.x. folgt, wird dies erkannt als ›mehrere Dokumente im Datenstrom‹. In diesem Fall werden nur die Objekte aus dem letzten Dokument des Datenstroms ermittelt.

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.STRUCT-MULTIPLE_DOCUMENTS_IN_STREAM

Stream endet nicht mit endstream-Keyword

Ein im Datenstrom enthaltener Stream endet nicht, wie von der Spezifikation vorgegeben, mit dem Keyword endstream. Bei jedem Stream muss dessen Länge angegeben sein. Im Datenstrom sollte dann (an der durch die Längenangabe vorgegebenen Stelle) das Schlüsselwort endstream stehen. Der Grund für ein fehlendes Endstream-Keyword kann verschieden sein, beispielsweise:

  • Keyword fehlt tatsächlich

  • Falsche angegebene Länge des Streams (zu kurz oder zu lang).

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.MISSING_ENDSTREAM_KEYWORD . Dieser Fehler kann in manchen Fällen auch im Modus STRICT behoben werden, wobei dann ebenfalls diese Fehlermeldung geloggt wird.

Unbekanntes Root-Objekt im Trailer

Wenn ein unbekanntes Objekt im Trailer angegeben ist, wird dieses nach Möglichkeit ersetzt durch eine Referenz auf das korrekte Katalog-Objekt.

Wenn dieser Fehler auftritt und korrigiert wird, erscheint die Log-Meldung DOCP.FORMAT.PDF.STRUCT-TRAILER_WRONG_ROOT_OBJECT

Wenn eine der genannten Fehlersituationen aufgetreten ist, wird neben der oben angegebenen Log-Meldung auch immer noch eine generelle Log-Meldung produziert, die allgemein auf eine Bereinigung hinweist. Diese Meldung kann beispielsweise dafür genutzt werden, um dem Benutzer einen Hinweis anzuzeigen.

Siehe hierzu auch das Beispiel im Abschnitt Beispiel 7.32, „Behandlung/Erkennung von strukturell defekten Dokumenten“.

WICHTIG: Korrekte Anzeige der Dokumente kann bei Verwendung der toleranten Modi nicht garantiert werden!

[jadice viewer Version 6.1.29: Dokumentation für Entwickler. Veröffentlicht: 2024-10-28]