Benutzer mit den meisten Antworten
ItextSharp (Destination of Bookmarks in PDF)

Frage
-
Hallo Leute,
ich bin jetzt seit Stunden dabei, irgendwie aus einer ArrayList gefüllt mit Bookmarks eines PDF's die Seitennummern oder die Targets heraus zu bekommen! Hat einer eine Idee wie ich am besten an die Seitennummern komme auf die ein Bookmark zeigt?
Gruß
Esto
Antworten
-
Hallo Esto,
Die Bookmarks verweisen nicht immer auf Seitenzahlen, manchmal sind es sog. benannte Ziele.
Du könntest zunächst also die Bookmarks exportieren:using iTextSharp.text.pdf; // in: itextsharp.dll public class PdfUtils { public static void ExportBookmarksToXml(string pdfInputFile, string xmlOutputFile) { var reader = new PdfReader(pdfInputFile); var bookmarksList = SimpleBookmark.GetBookmark(reader); using (var outputFileStream = new FileStream(xmlOutputFile, FileMode.CreateNew)) { SimpleBookmark.ExportToXML(bookmarksList, outputFileStream, "ISO8859-1", true); } } }
Das Ergebnis ist eine XML-Datei, die i.e. so aussieht:
<Bookmark> <Title Page="1 FitH 668" Action="GoTo" >iText in Action, Second Edition</Title> <Title Named="G1.121714" Action="GoTo" >brief contents</Title> <Title Named="G1.121182" Action="GoTo" >contents</Title> <Title Named="G1.116059" Action="GoTo" >preface</Title> <Title Named="G1.116068" Action="GoTo" >preface to the first edition</Title> <!-- usw. --> </Title> </Bookmark>
Dabei steht hier Page="1 FitH 668" für a) erste Seite b) horizontal anpassen c) vertikale Plazierung. Die Named-Attribute speichern den Namen von sog. benannten Zielen (SimpleNamedDestination-Klasse), und diesen Zielnamen mußt Du noch nachschlagen, um die Seitennummer auf die verwiesen wird zu erhalten:
public class PdfUtils { // [...] public static void ExportNamedDestinations(string pdfInputFile, string xmlOutputFile) { var reader = new PdfReader(pdfInputFile); var namedDestionationsList = SimpleNamedDestination.GetNamedDestination(reader, false); using (var outputFileStream = new FileStream(xmlOutputFile, FileMode.Create)) { SimpleNamedDestination.ExportToXML(namedDestionationsList, outputFileStream, "ISO8859-1", true); } } }
Das Resultat ist eine XML-Ausgabe mit folgendem Inhalt:
<?xml version="1.0" encoding="ISO8859-1"?> <Destination> <!-- schnipp --> <Name Page="8 XYZ 66 436 null">G1.121714</Name> <Name Page="8 XYZ 66 387 null">G1.121716</Name> <!-- schnipp --> </Destination>
Wie Du siehst entspricht dem 2. XML-Element aus der ersten XML-Ausgabe "G1.121714" die Seitennummer "8".
Nun mußt Du also lediglich - wenn Du das Ganze programmatisch erledigen willst - die zwei Auflistungen verschachtelt durchlaufen und für jedes Page-Attribut aus der bookmarksList die Seitennummer parsen, für jedes Named-Attribut hingegen das entsprechende Page-Attribut in der namedDestinationsList nachschlagen und parsen.
Gruß
Marcel- Als Antwort vorgeschlagen Elmar BoyeEditor Freitag, 9. November 2012 20:56
- Als Antwort markiert Ionut DumaModerator Mittwoch, 14. November 2012 15:43
Alle Antworten
-
Hallo Esto,
Die Bookmarks verweisen nicht immer auf Seitenzahlen, manchmal sind es sog. benannte Ziele.
Du könntest zunächst also die Bookmarks exportieren:using iTextSharp.text.pdf; // in: itextsharp.dll public class PdfUtils { public static void ExportBookmarksToXml(string pdfInputFile, string xmlOutputFile) { var reader = new PdfReader(pdfInputFile); var bookmarksList = SimpleBookmark.GetBookmark(reader); using (var outputFileStream = new FileStream(xmlOutputFile, FileMode.CreateNew)) { SimpleBookmark.ExportToXML(bookmarksList, outputFileStream, "ISO8859-1", true); } } }
Das Ergebnis ist eine XML-Datei, die i.e. so aussieht:
<Bookmark> <Title Page="1 FitH 668" Action="GoTo" >iText in Action, Second Edition</Title> <Title Named="G1.121714" Action="GoTo" >brief contents</Title> <Title Named="G1.121182" Action="GoTo" >contents</Title> <Title Named="G1.116059" Action="GoTo" >preface</Title> <Title Named="G1.116068" Action="GoTo" >preface to the first edition</Title> <!-- usw. --> </Title> </Bookmark>
Dabei steht hier Page="1 FitH 668" für a) erste Seite b) horizontal anpassen c) vertikale Plazierung. Die Named-Attribute speichern den Namen von sog. benannten Zielen (SimpleNamedDestination-Klasse), und diesen Zielnamen mußt Du noch nachschlagen, um die Seitennummer auf die verwiesen wird zu erhalten:
public class PdfUtils { // [...] public static void ExportNamedDestinations(string pdfInputFile, string xmlOutputFile) { var reader = new PdfReader(pdfInputFile); var namedDestionationsList = SimpleNamedDestination.GetNamedDestination(reader, false); using (var outputFileStream = new FileStream(xmlOutputFile, FileMode.Create)) { SimpleNamedDestination.ExportToXML(namedDestionationsList, outputFileStream, "ISO8859-1", true); } } }
Das Resultat ist eine XML-Ausgabe mit folgendem Inhalt:
<?xml version="1.0" encoding="ISO8859-1"?> <Destination> <!-- schnipp --> <Name Page="8 XYZ 66 436 null">G1.121714</Name> <Name Page="8 XYZ 66 387 null">G1.121716</Name> <!-- schnipp --> </Destination>
Wie Du siehst entspricht dem 2. XML-Element aus der ersten XML-Ausgabe "G1.121714" die Seitennummer "8".
Nun mußt Du also lediglich - wenn Du das Ganze programmatisch erledigen willst - die zwei Auflistungen verschachtelt durchlaufen und für jedes Page-Attribut aus der bookmarksList die Seitennummer parsen, für jedes Named-Attribut hingegen das entsprechende Page-Attribut in der namedDestinationsList nachschlagen und parsen.
Gruß
Marcel- Als Antwort vorgeschlagen Elmar BoyeEditor Freitag, 9. November 2012 20:56
- Als Antwort markiert Ionut DumaModerator Mittwoch, 14. November 2012 15:43