如何在 Linux 中提取/光栅化 PDF

Sam*_*mpo 19 linux pdf printing

我们办公室有一台打印机,可以从 U 盘打印 PDF 文件。它可以打印大多数文件,但有些文件存在问题,尤其是使用 Latex 生成的文件。有些 PDF 只是拒绝打印,有些 PDF 使用 courier-type 字体打印,而有些 PDF 打印得很好,除了方程式。

我正在寻找一种方法将 PDF“提炼”成一种绝对可靠的格式进行打印。通过将 PDF 简化/规范化到任何渲染器都可以正确渲染它的程度,或者简单地使每个页面成为 PDF 中的 600dpi 光栅图像。(我可以将 PDF 拆分为单独的光栅图像并手动组合它们,但我想要一些可编写脚本的内容。)

输出文件大小无所谓,只要确定打印,有A4纸大小(或原件)和300~600dpi分辨率即可。

Sam*_*mpo 31

在尝试了一些将字体渲染为轮廓的选项失败后(包括这个问题和 pstoedit),我想出了一种使用 ImageMagick 轻松将 PDF 转换为光栅化形式的方法:

convert -density 600 +antialias input.pdf output.pdf
Run Code Online (Sandbox Code Playgroud)

这将创建一个以 600 dpi 呈现的 PDF,并关闭抗锯齿(在该分辨率下是不必要的)。

输出文件很大(8 页文档约 30 MB)并且打印速度极慢,但只要打印机有足够的内存来呈现内容,就应该可以工作。

  • 请注意,`convert` 不会保留您可能已填写的表单内容。(我想对 PDF 进行光栅化,以确保表单内容在任何地方看起来都一样,尤其是每个 PDF 查看器首先会显示它们。)为了保留表单内容,请使用 `evince` (或您用来填写表单的任何应用程序)以将文档“打印到文件”——这是另一个 PDF,其中表单内容实际上已成为常规文本的一部分。然后您仍然可以根据您的需要对这个新 PDF 进行光栅化。 (2认同)

CPB*_*PBL 9

这是对已接受答案的改进:它还可以gs优化文件,使其不那么大,并修复偶尔的兼容性问题:

convert -render -density 300 input.pdf tmp.pdf
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=input-scanned.pdf tmp.pdf
Run Code Online (Sandbox Code Playgroud)

我非常频繁地使用此功能:任何时候我对 PDF 进行注释或在 PDF 上签名等,并且想要修复这些编辑或使它们变得超便携。因此,作为 bash 脚本(即将其放入 ~/.aliases 中并打开一个新的终端窗口):

(脚本evince在最后调用。这是一个 PDF 查看器。您可以将其替换为您最喜欢的 PDF 查看器)。

rasterizePDF() {
echo "Usage: rasterizePDF fromfile.pdf : this makes a 300dpi raster version. And optimizes it with ghostscript. Output is fromfile.pdf-scanned.pdf"
tmpfile=$(mktemp).pdf
echo "Creating raster version... (in $tmpfile)"
convert -render -density 300 $1 $tmpfile
echo "Optimizing to shrink pdf file..."
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$1-scanned.pdf $tmpfile
evince $1-scanned.pdf&
echo "Finished; launched viewer."
}
Run Code Online (Sandbox Code Playgroud)