Hallo Zusammen,
ich muss für einen Kunden PDF auf seiner Webseite indexieren. Die PDF sind irgendwo auf Webseite verlinkt.
Wenn jemand von Euch einen guten Einfall hat, wäre für Hinweise dankbar.
Mein aktuelle Ansatz:
1) Wir iterieren über alle HTMLs und PDFs des Kunden. (HTMLs sind nötig um die komplette Seite zu durchsuchen)
boolean followUrl(String url, String baseHost) {
// ==~ entspricht einem Java "Mein String".matches("<regex>");
def isHtml = (url ==~ /.*\.html$/)
def isPdf = (url ==~ /.*\.pdf$/)
def isCustomerHost = (url ==~ "^https://example.com/.*")
return (isCustomerHost && isPdf) || (isCustomerHost && isHtml)
}
2) Beim Enhancer entfernen wir alle HTMLs:
void manipulate(final Document document, final String html, final org.jsoup.nodes.Document jsoupDocument) {
def link = document.getData('link').get(0)
if(link ==~ /.*\.pdf$/) {
def orgContent = document.getData('content').get(0) // wurde Automatisch befüllt mit Tika
// DO SOMETHING with PDF
} else {
// Skip non PDF files
document.removeData('content'); // Das erzeugt eine Warnung im Log
}
}
Diese Lösung hat folgende Probleme:
- HTML Seiten werden automatisch mit Tika indexiert ohne das Parameter gesetzt werden können.
Folge: Es können nur die ersten 10.000 Zeichen von PDF indexiert werden, denn da greift default CharLimit von Tika
- Es gibt keine Möglichkeit Dokumente ohne Warnung zu verwerfen. Oder?

Für das 10.000 Zeichen Limit fällt mir nur ein nochmal das PDF im Enhancer zu parsen.
void manipulate(final Document document, final String html, final org.jsoup.nodes.Document jsoupDocument) {
...
def charLimit = -1
def textHandler = new org.apache.tika.sax.BodyContentHandler(charLimit)
def metadata = new org.apache.tika.metadata.Metadata()
def parser = new org.apache.tika.parser.pdf.PDFParser() //pdf parser
def stream = new java.net.URL(link).newInputStream()
try {
parser.parse(stream, textHandler, metadata);
document.removeData('content')
document.addData('content', textHandler.toString())
...
}
...
}
Ich könnte noch testen ob weniger als 10.000 Zeichen im Content Feld sind, bevor nochmal anfange zu Parsen.