2008-10-06 3 views
6

Ich möchte etwas (Java) -Code schreiben, die ein PDF-Dokument nimmt, und benannte Ziele aus allen Lesezeichen erstellt. Ich denke, die iText-API ist der einfachste Weg, dies zu tun, aber ich habe die API noch nie zuvor verwendet.Erstellen Sie Ziele für alle Lesezeichen in einer PDF-Datei mit iText-API

Wie würden Sie diese Art von Code mit der iText-API schreiben? Kann iText das Parsen durchführen, um bestehende PDFs selbst zu manipulieren? Die Art von Manipulationen ich denke ich, sind:

  • Open,
  • Lesezeichen finden,
  • Ziele erstellen,
  • speichern,
  • schließen.

Oder gibt es eine andere API, die besser wäre?

Antwort

3

Ich werde dich nur davor warnen, dass du vielleicht enttäuscht bist. iText ist nicht wirklich als Parser gedacht. Es ist wirklich mehr für die Schaffung völlig neue PDF-Dokumente, aber Sie können einen Schlag auf sie nehmen.

Um mit iText zu starten, können Sie das vorhandene PDF-Dokument nicht ändern. Was Sie können tun, ist jedoch, um eine Kopie mit den zusätzlichen Funktionen, die Sie wollen. (Wenn jemand anderes besser weiß, bitte lassen Sie mich wissen, das macht mich verrückt.)

Was Sie tun möchten, ist ein PdfReader-Objekt aus einem Eingabestream auf Ihrer Quelldatei zu erstellen. Erstellen Sie dann ein PdfCopy-Objekt (das ist nur ein erweiterter PdfWriter, mit dem Daten aus einer vorhandenen Quelle bequemer abgerufen werden können) für Ihr Ziel.

Soweit ich das beurteilen kann, können die Lesezeichen überhaupt nicht von iText bezogen werden. Eine andere Bibliothek wird möglicherweise benötigt. Ich denke, jpedal kann die Fähigkeit haben, sie zu extrahieren (es kann sie als XML-Dokument erhalten, das Sie dann analysieren müssen, um zu bekommen, was Sie wollen.) Wie auch immer Sie sie erhalten, können Sie sie dann zu java.util hinzufügen. Liste, und legen Sie diese Liste als Gliederung für PDFCopy fest. Die Lesezeichen selbst sind nur HashMaps mit bestimmten Schlüsseln. Ich bin mir nicht sicher, was alle Werte sind, aber sie beinhalten "Titel", "Aktion" (was scheint zu sein, wo Sie angeben würden, dass dies ein benannter Bestimmungsort ist, obwohl ich nicht weiß, was dieser Wert wäre) und "URI" (wird verwendet, wenn es sich um eine externe Verbindung handelt - ich vermute, dass dies den Namen des benannten Ziels angeben würde, mit dem Sie verlinken). Auch hier sind die Details schwer zu finden.

Dann iterieren Sie über die Seiten des Lesers und importieren Sie jede Seite in die PdfCopy. this page kann Ihnen helfen.

Entschuldigung, ich bin nicht hilfreicher für Sie. Viel Glück.

P.S. Wenn jemand anderes von einem besseren Tool weiß, das entweder (L) GPL oder BSD lizenziert ist, würde ich gerne davon hören.

+0

Danke, das gibt mir genug, um mit voranzukommen. –

5

Follow-up: Ich habe vor ein paar Monaten einen Patch an iText gesendet (er wurde jetzt akzeptiert und ist Teil von HEAD), der Textanalyse-Funktionen zu iText hinzufügt. PdfBox (siehe unten) hat (hatte?) Probleme mit dem Lesen neuere PDFs, die Xref-Streams anstelle des älteren XRef-Tabellenformats verwenden.


Eine andere Bibliothek, die sehr gut Parsen bestehenden PDF-Dateien ist PdfBox Es kann auch zum Bearbeiten eines vorhandenen PDF verwendet werden. FYI - das ist der Text-Parser, den Lucene verwendet.

Ich werde auch erwähnen, dass iText hat die Möglichkeit, eine PDF-Datei zu analysieren, es ist einfach nicht gut bei der Analyse des Textinhalts auf jeder Seite. Wenn Sie auf die PDF-Konstrukte auf höherer Ebene (Wörterbücher, usw.) zugreifen, die zum Speichern von Lesezeichen usw. verwendet werden, und es Ihnen nichts ausmacht, sich beim Lesen der PDF-Spezifikation die Hände schmutzig zu machen, dann können Sie das tun mach absolut das, wonach du fragst (wir machen es selbst ziemlich oft). Die PDF Spec ist groß, aber größtenteils lesbar, und Sie müssen sich nicht um den Großteil davon kümmern (der auf tatsächlichen Seiteninhalt und Rendering ausgerichtet ist), wenn Sie nur versuchen, Lesezeichen zu extrahieren .

Verwandte Themen