So destillieren / rasteren Sie ein PDF unter Linux

13

Wir haben einen Drucker in unserem Büro, der PDF-Dateien von einem USB-Stick druckt. Es druckt die meisten Dateien in Ordnung, hat jedoch Probleme mit einigen, insbesondere mit Latex generierten. Einige PDFs werden einfach nicht gedruckt, einige PDFs werden mit Kurierschrift gedruckt, andere werden mit Ausnahme von Gleichungen einwandfrei gedruckt.

Ich suche nach einer Möglichkeit, PDFs in ein absolut sicheres Format zum Drucken zu "destillieren". Entweder indem Sie die PDF-Datei so vereinfachen / normalisieren, dass sie von jedem Renderer korrekt gerendert wird, oder indem Sie einfach jede Seite zu einem 600-dpi-Rasterbild in der PDF-Datei machen. (Ich könnte das PDF in einzelne Rasterbilder aufteilen und manuell kombinieren, aber ich möchte etwas Skriptfähiges.)

Die Größe der Ausgabedatei spielt keine Rolle, solange sie sicher gedruckt werden kann. Sie hat ein A4-Papierformat (oder das Original) und eine Auflösung von 300 bis 600 dpi.

Sampo
quelle
Vielleicht könnte pdf2ps helfen, wenn der Drucker Postscript unterstützt.
Frlan
Es soll ein PostScript-Drucker sein, aber diese Unterstützung ist noch schlechter als die von PDF (und es wird kein PS von einem USB-Stick gedruckt).
Sampo

Antworten:

22

Nachdem ich einige Optionen zum Rendern der Schriftarten als Konturen (einschließlich dieser Frage und pstoedit) erfolglos ausprobiert hatte , fand ich eine Möglichkeit, die PDF-Datei mit ImageMagick einfach in eine gerasterte Form zu konvertieren:

convert -density 600 +antialias input.pdf output.pdf

Dadurch wird ein PDF mit 600 dpi erstellt, wobei die Antialias deaktiviert sind (bei dieser Auflösung nicht erforderlich).

Die Ausgabedateien sind sehr groß (~ 30 MB für ein 8-seitiges Dokument) und extrem langsam zu drucken. Sie sollten jedoch funktionieren, solange der Drucker über genügend Speicher zum Rendern des Inhalts verfügt.

Sampo
quelle
1
Ja! Ich habe dies verwendet, um die Ebenen in meinem PDF mit großem Erfolg zu reduzieren. + Antialias war nicht notwendig, da wir nur Bilder hatten (es machte keinen Unterschied) und ich die Auflösung auf 150 senkte, da dies für die Archivierung gut genug schien, ohne so viel Platz zu beanspruchen. Vielen Dank!
mlissner
2
Beachten Sie, dass convertder Inhalt von Formularen, die Sie möglicherweise ausgefüllt haben , nicht erhalten bleibt. (Ich wollte ein PDF rastern, um sicherzustellen, dass der Formularinhalt überall gleich aussieht, insbesondere, dass er von jedem PDF-Viewer angezeigt wird.) Um den Formularinhalt beizubehalten, verwenden Sie evince(oder was auch immer) Anwendung, mit der Sie das Formular ausgefüllt haben), um das Dokument "in eine Datei" zu drucken - dies ist eine weitere PDF-Datei, bei der der Formularinhalt tatsächlich Teil des regulären Textes geworden ist. Dann können Sie diese neue PDF-Datei je nach Ihren Anforderungen noch rastern.
Balu
Beachten Sie, dass dadurch das Antialiasing aktiviert ( +antialias) und nicht deaktiviert wird ( -antialias).
xiii1408
Nein, +antialiasdeaktiviert Antialiasing: imagemagick.org/script/command-line-options.php?#antialias
Sampo
1
Ich musste imagemagick ( stackoverflow.com/questions/42928765/… ) optimieren , damit dies funktioniert.
SteveSong
1

Die Verwendung von imagemagick ist meiner Erfahrung nach bei hohen Auflösungen und / oder großen Dateien nicht stabil. Viele Drucker können 1200 dpi und mehr verarbeiten, daher sollte die gerasterte Datei eine ähnliche Auflösung haben. Eine bessere Lösung ist die Verwendung von pdf2djvu, das schneller und robuster ist und sogar Dateien mit einer Größe erstellt, die häufig mit der Original-PDF-Datei mit 1200 oder 2400 dpi mithalten kann. Diese Dateien können mit okular oder evince angezeigt und gedruckt werden.

Beispiel:

pdf2djvu -d 2400 file.pdf > rastered.djvu
mjo
quelle
1

Ich denke, mein derzeit bevorzugter Weg ist:

  1. Verwenden Sie pdftoppm, um die PDF-Datei in eine Reihe von Bildern zu konvertieren.

    $ pdftoppm source.pdf output -png

  2. Verwenden Sie img2pdf, um aus diesen Bildern eine PDF-Datei zu erstellen.

    $ img2pdf * .png -o output.pdf

Die gute Nachricht ist, dass Sie ein Bash-Skript erstellen können, um den gesamten Prozess für Sie zu automatisieren.

Hier ist ein Bash-Skript, das alle PDF-Dateien in einem Verzeichnis destilliert und die Originale in einem neuen Verzeichnis "Originale" aufbewahrt.

#!/bin/bash

mkdir "originals";
for filename in ./*.pdf; do
    pdftoppm "$filename" output -png
    mv "$filename" ./originals
    img2pdf *.png "-o" "$filename"
    rm *.png
done

Credits: img2pdf Antwort & pdftoppm Antwort & Bash Skript Hilfe: 1 & 2

(Randnotiz) Sie können img2pdf installieren mit:

$ sudo apt install img2pdf

Michael
quelle
-1

Eine andere Alternative ist die Konvertierung in Bilder über so etwas wie

pdfimages

Auf der Manpage speichert Pdfimages Bilder aus einer PDF-Datei (Portable Document Format) als Portable Pixmap- (PPM), Portable Bitmap- (PBM) oder JPEG-Dateien. Pdfimages liest die PDF-Datei der PDF-Datei, scannt eine oder mehrere Seiten und schreibt eine PPM-, PBM- oder JPEG-Datei für jedes Bild, image-root-nnn.xxx, wobei nnn die Bildnummer und xxx der Bildtyp (.ppm, .pbm, .jpg) ist. "

Verwenden Sie dann pdftk, um wieder in PDF zu konvertieren. Https://www.pdflabs.com/docs/pdftk-cli-examples/

Drucken Sie abschließend diese Datei. Offensichtlich ist die Schlüsselfrage, wie man dies schreibt.

Sie können dies über eine einfache Webseite für Benutzer automatisieren. Schließlich drucken sie die konvertierte Datei aus und Sie sollten eine höhere Leistung und einen funktionierenden Ausdruck haben?

dtbnguyen
quelle
3
pdfimages extrahiert eingebettete Rasterbilder aus PDF-Dateien, rastert den Text oder die Vektorgrafiken nicht.
Sampo