Artikel-Schlagworte: „docxtotext“

Word .doc zu .txt mittels PHP

Freitag, 19. März 2010

Vor ein paar Tagen stand ich vor dem Problem, mittels PHP Word-Documente, die auf den Webserver geladen wurde, auszulesen. Sinn der ganzen Übung ist, den reinen Text des Dokumentes in einer mySQL-Datenbank zu speichern, um dann darüber recherchieren zu können.  Stichwort webbasierendes Dokumentenmanagement, an dem ich für meine Firma arbeite. Außerdem war das Problem vorhanden, .pdf Dokumente ebenso mit indexieren zu können. Nach vielem Basteln und googlen habe ich eine brauchbare Lösung gefunden.

PDF zu Text:

Die einfachste und brauchbarste Methode, um .pdf Dokumente auszulesen, ist meiner Ansicht das Shellscript pdftotext von Xpdf, welches frei Verfügbar ist. Es gibt unter Anderem eine Windows Version, und, wie kann es wohl sein :) , auch eine Linuxversion.
Ich lade mir das PDF Dokument auf den Server (mittels Formular, oder wie auch immer), stoße die pdftotext.exe (ja es ist ein Windows Server) mittels shellexecute an und lese die erzeugte Temp-Datei wieder aus. Dies klappt wunderbar. Das Ergebnis speichere ich dann in einem “TEXT-Spalte” in mySQL und kann wunderbar per LIKE im Text suchen lassen. Für alle Nachahmer: beachtet, das bei großen Datenmengen die Suche natürlich ein wenig dauern kann ;)

.doc zu Text

Bei den alten Word .doc habe ich im Internet diverse Möglichkeiten gefunden, wie zB das Nutzen des COM Objektes von PHP. Nachteil: auf dem Server muss WORD installiert sein (tseses!). Hier stelle ich aber eine andere Methode vor, die etwas einfacher zu handhaben ist:

Ich habe bei der Suche nach einer Lösung folgendes Script im Netz gefunden:

function doc2text($filename)
{
if ( file_exists($filename) )
{
if ( ($fh = fopen($filename, 'r')) !== false )
{
$headers = fread($fh, 0xA00);
# 1 = (ord(n)*1) ; Document has from 0 to 255 characters
$n1 = ( ord($headers[0x21C]) - 1 );
# 1 = ((ord(n)-8)*256) ; Document has from 256 to 63743 characters
$n2 = ( ( ord($headers[0x21D]) - 8 ) * 256 );
# 1 = ((ord(n)*256)*256) ; Document has from 63744 to 16775423 characters
$n3 = ( ( ord($headers[0x21E]) * 256 ) * 256 );
# (((ord(n)*256)*256)*256) ; Document has from 16775424 to 4294965504 characters
$n4 = ( ( ( ord($headers[0x21F]) * 256 ) * 256 ) * 256 );
# Total length of text in the document
$textLength = ($n1 + $n2 + $n3 + $n4);
$extracted_plaintext = fread($fh, $textLength);
# if you want the plain text with no formatting, do this
//echo $extracted_plaintext;
# if you want to see your paragraphs in a web page, do this
return nl2br($extracted_plaintext);
}
}
}

Diese Minifunktion reicht für meine Bedürfnisse vollkommen aus, auch wenn manchmal ein paar Datenkrüppel vorhanden sind. Häufig auftretende fehlerhaften Strings werden vor dem Speichern in die DB noch entfernt.

(weiterlesen…)