解决方案

解决方案

我们办公室有一台打印机,可从 USB 棒打印 PDF 文件。它可以正常打印大多数文件,但打印某些文件时会出现问题,尤其是使用 Latex 生成的文件。有些 PDF 文件它根本无法打印,有些 PDF 文件使用 courier 字体打印,有些 PDF 文件打印正常(方程式除外)。

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

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

答案1

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

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

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

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

答案2

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

convert -render -density 300 input.pdf tmp.pdf
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=input-scanned.pdf tmp.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."
}

答案3

我认为我目前首选的方式是:

  1. 使用 pdftoppm 将 PDF 文件转换为一系列图像。

    $ pdftoppm 源.pdf 输出 -png

  2. 使用 img2pdf 从这些图像创建一个 pdf 文件。

    $ img2pdf *.png -o 输出.pdf

好消息是您可以创建一个 bash 脚本来自动完成整个过程。

这是一个 bash 脚本,它将提取目录中的所有 pdf 文件并将原始文件保存在新目录“originals”中。

#!/bin/bash

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

致谢:img2pdf 答案&pdftoppm 答案& bash 脚本帮助:1&2

(边注)您可以使用以下方式安装 img2pdf:

$ sudo apt 安装 img2pdf

答案4

解决方案

以下代码以 1200 DPI 进行栅格化a.pdfc.pdf,最初以 2400 DPI 进行栅格化,然后在输出之前缩小 2。文档

gs -dNOPAUSE -dBATCH -sDEVICE=pdfimage24 -r2400 -dDownScaleFactor=2 -o c.pdf a.pdf

如果只需要打印黑白,可以替换pdfimage24为,pdfimage8以加快速度。

基准

可以看出,上面的解决方案是最快的,仅输给pdf2ps+ ps2pdf(但pdf2ps+ps2pdf不保证栅格化文件)和pdf2ppm(但转换以.jpg放大文件)

解决方案 所用时间(秒) 已占用内存 (KiB) 输出文件大小 (KiB) 打印时间(秒)
pdftoppm(1200)(.jpg)+ img2pdf(†) 2.710 603092 10341.3
pdf2ps+ps2pdf使用临时文件 (来源)(*) 4.110 37596 1706.4
pdfimage8(1200) 4.180 35668 2348.6 9.5
pdfimage24(1200/2) 5.020 36088 1971.9 9.7
pdfimage24(1200) 6.520 36212 3316.1
pdf2ps+ps2pdf带管道 (*) 7.230 37668 1706.4
convert(600) 9.560 964532 5953.6
pdftoppm(1200)(.tiff)+ img2pdf(†) 10.850 1539512 14483.3
convert(600)+gs优化(来源 12.010 964532 1989.4 9.9
pdfimage8(2400/2) 20.350 43872 3481.9
pdfimage24(2400/2) 23.510 46484 4833.2 15.8
pdftoppm(1200)(.png)+ img2pdf来源)(†) 33.000 626896 14127.2

(*): 解决方案实际上并不总是栅格化 PDF,但gs可能在某些情况下决定这样做(不知道在哪种情况下会这样做,可能是 PDF 过于复杂的情况)。

(†):所写代码仅适用于 1 页 PDF 文件,但可以进行调整。

基准解决方案的详细信息

pdftoppm(1200)(.jpg)+ img2pdf(†)

pdftoppm -progress -r 1200 -jpeg a.pdf a
img2pdf a-1.jpg -o c.pdf

pdf2ps+ps2pdf使用临时文件 (来源)(*)

gs -sDEVICE=ps2write -dNOCACHE -sOutputFile=c.ps -q -dBATCH -dNOPAUSE a.pdf
ps2pdf c.ps c.pdf

pdfimage8(1200)

gs -dNOPAUSE -dBATCH -sDEVICE=pdfimage8 -r1200 -o c.pdf a.pdf

pdfimage24(1200/2)

gs -dNOPAUSE -dBATCH -sDEVICE=pdfimage24 -r1200 -dDownScaleFactor=2 -o c.pdf a.pdf

pdfimage24(1200)

gs -dNOPAUSE -dBATCH -sDEVICE=pdfimage24 -r1200 -o c.pdf a.pdf

pdf2ps+ps2pdf带管道 (*)

gs -sDEVICE=ps2write -dNOCACHE -sOutputFile=- -q -dBATCH -dNOPAUSE a.pdf -c quit | ps2pdf - c.pdf

convert(600)

convert -density 600 a.pdf c.pdf

pdftoppm(1200)(.tiff)+ img2pdf(†)

pdftoppm -progress -r 1200 -tiff a.pdf a
img2pdf a-1.tif -o c.pdf

convert(600)+gs优化(来源

convert -density 600 a.pdf b.pdf
gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite  -sOutputFile=c.pdf b.pdf   -q

pdfimage8(2400/2)

gs -dNOPAUSE -dBATCH -sDEVICE=pdfimage8 -r2400 -dDownScaleFactor=2 -o c.pdf a.pdf

pdfimage24(2400/2)

gs -dNOPAUSE -dBATCH -sDEVICE=pdfimage24 -r2400 -dDownScaleFactor=2 -o c.pdf a.pdf

pdftoppm(1200)(.png)+ img2pdf来源)(†)

pdftoppm -progress -r 1200 -png a.pdf a
img2pdf a-1.png -o c.pdf

基准测试的源代码可以在这里找到这里

相关内容