Beheben von Problemen mit pdftotext-Schriftarten

5683
karel

Ich verwende pdftotext, um eine ASCII-Version eines PDF-Dokuments (erstellt mit LaTeX) zu erstellen, da Mitarbeiter ein einfaches Dokument in MS Word bevorzugen.

Die Klartextversion, die ich sehe, sieht gut aus, aber bei näherer Betrachtung scheint das f-Zeichen häufig falsch konvertiert zu werden, abhängig davon, welche Zeichen folgen. Zum Beispiel scheinen fi und fl oft ein Sonderzeichen zu werden, das ich hier einfügen möchte: fi und fl.

Was ist der beste Weg, um die Ausgabe von pdftotext zu bereinigen? Ich denke, es sedkönnte das richtige Werkzeug sein, aber ich bin nicht sicher, wie ich diese Sonderzeichen erkennen kann.

3
fl, fi, ff, ffl und ffi sind übliche typografische Ligaturen, die häufig durch ein einzelnes Zeichen (und definitiv durch TeX) ersetzt werden: http://en.wikipedia.org/wiki/Typographic_ligature#Computer_typesetting - vielleicht müssen Sie das nur überprüfen dass die Schriftart, in der Sie die Ausgabe anzeigen, diese enthält und dass die Kodierung richtig ist. frabjous vor 13 Jahren 0
oh, und du meinst "pdftotext" von poppler, richtig, nicht "pdftotex"? frabjous vor 13 Jahren 0
Haben Sie die ursprüngliche TeX-Quelle? Warum nicht mit latex2rtf oder oolatex (von TeX4ht) eine Textverarbeitungsdatei für die Word-Junkies erstellen? Das Kompilieren in PDF und das Konvertieren in einfachen Text scheint eine sehr ungewöhnliche Route für die Konvertierung zu sein. frabjous vor 13 Jahren 0
Wenn Sie jedoch PDF in einfachen Text konvertieren möchten, sollten Sie `ebook-convert` vom Kaliber (http://calibre-ebook.com) anstelle von 'pdftotext' in Betracht ziehen. Es ermöglicht die Ausgabe von Klartext (und einer Vielzahl anderer Formate) und behandelt Ligaturen für Sie. frabjous vor 13 Jahren 0
Ich meinte pdftotex * t *. Tippfehler behoben. Ich habe original TeX source, aber latex2rtf und oolatex funktionieren nicht so gut wie pdftotext. Ich verwende zusätzliche Pakete wie `siunitx` und` glossaries`, und daher scheint es, als sei das PDF-Programm die beste Lösung. Ich wünschte, es gäbe einen besseren Weg. vor 13 Jahren 0
Danke für den 'ebook-convert'-Vorschlag, der besser zu funktionieren scheint als' pdftotext '. vor 13 Jahren 0

2 Antworten auf die Frage

3
davidg

Standardmäßig werden pdftotextUnicode-Daten (UTF-8) ausgegeben. Wenn Ihr Terminal oder Texteditor UTF-8 nicht unterstützt, werden Ligaturen wie "fi" und "fl" (die als einzelnes Zeichen in Unicode dargestellt werden können) merkwürdig angezeigt, wie Sie bemerkt haben.

Die einfache Lösung besteht darin, pdftotextASCII anstelle von Unicode auszugeben:

pdftotext -enc ASCII7 input.pdf output.txt 

Dies sollte zu einer sauberen ASCII-Ausgabe führen, sodass Sie sie nicht mehr manuell bereinigen müssen.

Vielen Dank. Ich fand den oben genannten 'ebook-convert'-Vorschlag am besten. Ihr Rat könnte das Standardverhalten von `pdfottext` verbessern, aber ich denke, mein Terminal unterstützt UTF-8 und` ebook-convert` scheint mit Superskripten und anderen Dingen besser umzugehen. vor 13 Jahren 0
Diese Lösung funktioniert auch nicht, wenn Sie tatsächlich Unicode-Zeichen in Ihrer Ausgabe benötigen. amenthes vor 5 Jahren 0
1
frabjous

Wenn Sie sich auf einem Unix-basierten System befinden, können Sie dies auf der Ausgabe von pdftotext ausführen:

sed -i -e 's/ffi/ffi/g' -e 's/fi/fi/g' -e 's/ff/ff/g' -e 's/fl/fl/g' -e 's/ffl/ffl/g' output.txt 

Dies sollte die Ligaturen durch die einzelnen Buchstaben ersetzen, in die sie eingebrochen sind. (Siehe meine Kommentare oben, was Ligaturen damit zu tun haben.)

Ich habe das an einer Textdatei getestet, die pdftotextaus einem von LaTeX generierten PDF generiert wurde. Und es hat gut funktioniert. Wenn der LaTeX jedoch eine nicht standardmäßige Codierung oder Schriftart mit zusätzlichen Ligaturen verwendet, muss möglicherweise noch mehr getan werden.

Sie sollten wahrscheinlich sicherstellen, dass die in Ihrem Terminal verwendete Schriftart über Zeichen für die Ligaturen der f-Serie verfügt. DejaVu Sans Mono ist eine gute Wahl.

Falls Ihr Terminal nicht utf-8 ist (z. B. Windows cmd.exe), können Sie dies auch mit der Byte-Darstellung tun: `sed -e 's / \\ xEF \\ xAC \\ x80 / ​​ff / g' - e 's / \\ xEF \\ xAC \\ x81 / fi / g' -es / \\ xEF \\ xAC \\ x82 / fl / g '-es / \\ xEF \\ xAC \\ x83 / ffi / g '-es / \\ xEF \\ xAC \\ x84 / ffl / g' -e 's / \\ xEF \\ xAC \\ x85 / ft / g' -es / \ \ xEF \\ xAC \\ x86 / st / g ''. amenthes vor 5 Jahren 0