VroniPlag Wiki

This Wiki is best viewed in Firefox with Adblock plus extension.

MEHR ERFAHREN

VroniPlag Wiki

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>