2017-07-04 2 views
0

Ich versuche, PDFs zusammenzuführen und die ursprünglichen Lesezeichen beizubehalten. Ich verwende die hier beschriebene Methode: Merging documents with bookmarks jedoch werden nicht alle Lesezeichen importiert. Das heißt, Lesezeichen aus einigen Dateien werden importiert, aber nicht aus anderen Dateien.itext 7 Importieren von Gliederung/Lesezeichen

Mit RUPS (tool that can help you debug PDFs) sieht es aus wie das Problem ist die Objektnummer des Gliederungsobjekts. In der Datei, die funktioniert, ist der Gliederungsbaum das Objekt 1 0 und in der Datei, die nicht funktioniert, ist der Gliederungsbaum das Objekt 16 0. Oder er kann mit der Objektreihenfolge für den Seitenbaum in der importierenden Datei in Verbindung stehen Umrißbaum kommt vor dem Seitenbaum. In der Datei, die nicht funktioniert, kommt der Seitenbaum zuerst.

Da RUPS den Gliederungsbaum lesen und verstehen kann, gibt es eine Einstellung, die es itext 7 ermöglicht, diese Lesezeichen zu importieren?

Ich benutze Itext-Community für C#.

+0

Welche Version von iText7 verwenden Sie? Ich erinnere mich daran, einen Fehler behoben zu haben, der verhinderte, dass die Lesezeichen in diesem Jahr mit 'PdfMerger' früher kopiert wurden. –

+0

Version 7.0.2.2 – Jeff

Antwort

0

halten Lesezeichen während der Zusammenführung (und Tag-Struktur) möglich ist, die PdfMerger Klasse unter Verwendung:

public void createPdf(List<String> srcs, String dest) throws IOException, IOException { 
    PdfWriter writer = new PdfWriter(dest); 
    PdfDocument pdfDoc = new PdfDocument(writer); 
    pdfDoc.initializeOutlines();//Make sure the target document has outlines to merge into 
    boolean mergeTags = true; 
    boolean mergeOutlines = true; //Outlines are bookmarks, it is the named used for them in the spec. 
    PdfMerger merger = new PdfMerger(pdfDoc, mergeTags,mergeOutlines);//THis is also equal to new PdfMerger(pdfDoc) 
    for (String src : srcs) { 
     PdfReader reader = new PdfReader(src); 
     PdfDocument from = new PdfDocument(reader); 
     merger.merge(from, 1, from.getNumberOfPages()); 
     from.close(); 
    } 
    merger.close(); 
} 

Dies funktioniert auf 7.0.3 und ab. Für die C# -Version sind die Methoden identisch, nur mit den Namen in Großbuchstaben.

+0

Dies machte den Unterschied beim Importieren der Lesezeichen. Nun stürzt itext jedoch für eine PDF-Datei ab, mit der es vorher keine Probleme hatte. Ich denke, es ist ein Problem mit einem veralteten Lesezeichen (nur Raten natürlich). Hier – Jeff

+0

ist der Stack-Trace: ‚bei iText.Kernel.Pdf.PdfDocument.CloneOutlines (ICollection'1 outlinesToCopy, PdfOutline newParent, PdfOutline oldParent, IDictionary'2 page2page, PDFDocument toDocument) bei iText.Kernel.Pdf.PdfDocument.CopyOutlines (ICollection'1 Gliederungen, PdfDocument toDocument, IDictionary'2 page2page) bei iText.Kernel.Pdf.PdfDocument.CopyPagesTo (IList'1 pagesToCopy, PdfDocument toDocument, Int32 insertBeforePage, IPdfPageExtraCopier Kopierer) ' – Jeff

+0

Sieht so aus, aber ohne die Eingabe pdf kann ich nicht sicher sagen. Sie könnten wahrscheinlich die Wurzel des Problems finden, indem Sie den Prozess debuggen (finden Sie den AGPL-Quellcode auf Github). RUPS ist auch ein handliches Werkzeug hier. Aber das ist schon eine andere Frage, und ich habe nicht die Zeit, es selbst durchzugehen. –