manchmal möchte man bspw. alle Seiten eines PDF-Dokumente, die Links enthalten, extrahieren.
Hier ein Lösungsansatz mit pdftohtml, sed, und saxonb-xslt.
pdftohtml - Erzeugen der XML-Datei[]
In einem ersten Schritt wird aus dem PDF eine xml-Datei erzeugt (hier Ausgabe nach STDOUT). Bilder ('-i') werden dabei ignoriert, Text, der normalweise nicht gerendert wird aber schon ('-hidden')
pdftohtml -i -stdout -hidden -xml DATEI.pdf
sed - Patchen[]
Die so generierte XML-Datei enthält korrekterweise eine dtd-Angabe
bla <!DOCTYPE pdf2xml SYSTEM "pdf2xml.dtd"> blup
was die weitere Verarbeitung aber erschwert, wenn das dtd nicht zur Verfügung steht. Für den Moment, wird diese Angabe einfach gelöscht.
sed 's/<!DOCT.*>//'
XSL - Extraktion der Seiten, die Links enthalten[]
Für die weitere Analyse sollen nur die Seiten extrahiert werden, die externe Links beinhalten. Außerdem sollen Seiten, die wahrscheinlich zum Literaturverzeichnis gehören (im Moment leider noch hard coded) nicht berücksichtigt werden.
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output omit-xml-declaration="no" indent="yes" doctype-public="pdf2xml" doctype-system="pdf2xml.dtd"/> <xsl:output method="xml"/> <xsl:template match="/*"> <document> <xsl:apply-templates select="page[text/a[contains(@href,'http')] and not(contains(text, 'Literaturverzeichnis'))]"/> </document> </xsl:template> <xsl:template match="page"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet>
Im ersten relevanten Teil werden alle Seiten (page) ausgewählt, die die in einem ihrer Text-Elemente (text) einen Link (a) enthalten, dessen Attribut (@href) auf eine Website (http) verweist, sofern nicht irgendwo auf der Seite gleichzeitig der Begriff "Literaturverzeichnis" zu finden ist.
<xsl:template match="/*">
<document>
<xsl:apply-templates select="page[text/a[contains(@href,'http')] and not(contains(text, 'Literaturverzeichnis'))]"/>
</document>
</xsl:template>
Die so gefundenen Seiten werden dann mit einfach ausgegeben.
<xsl:template match="page">
<xsl:copy-of select="."/>
</xsl:template>
Putting it all together[]
Am einfachsten ist es wahrscheinlich, den xsl-Code in eine Datei (bspw. extractlinks.xsl) zu speichern und dann folgenden Befehl auszuführen
pdftohtml -i -stdout -hidden -xml DATEI.pdf | sed 's/<!DOCT.*>//' | saxonb-xslt -s:- extractlinks.xsl > DATEI.xml
Beispiel[]
Nach Ausführen des obigen Befehls könnte DATEI.xml bspw. so aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document
PUBLIC "pdf2xml" "pdf2xml.dtd">
<document>
<page number="49" position="absolute" top="0" left="0" height="1262" width="892">
<text top="47" left="170" width="620" height="16" font="0">
AUSGABE GEKÜRZT
<text top="800" left="170" width="621" height="16" font="0">1. Der Kolmogorov-Smirnov-Test untersucht, ob zwe<a href="http://www.pflegewiki.de/wiki/Stichprobe">i Stichproben </a>(Datenreihen) aus </text>
AUSGABE GEKÜRZT
</page>
<page number="65" position="absolute" top="0" left="0" height="1262" width="892">
AUSGABE GEKÜRZT
<text top="825" left="170" width="621" height="16" font="0">
<a href="http://de.wikipedia.org/wiki/Hydroxylgruppe">Hydroxylgruppe </a>(-OH) einen negativen Einflussfaktor dar [108]. Es kommt zu </text>
AUSGABE GEKÜRZT
</page>
</document>