none
ItextSharp (Destination of Bookmarks in PDF) RRS feed

  • 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

    Freitag, 9. November 2012 11:21

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

    Freitag, 9. November 2012 14:51
    Moderator

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

    Freitag, 9. November 2012 14:51
    Moderator
  • Ich DANKE dir wirklich sehr!!! Ich war schon total am verzweifeln... :) THX Ich probiers gleich morgen mal aus....
    Freitag, 9. November 2012 18:56
  • Funktioniert einwandfrei.... :) Danke nochmal....
    Montag, 12. November 2012 11:18
  • Hallo Estorik,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Gruß,

    Ionut

    Mittwoch, 14. November 2012 15:43
    Moderator