我们办公室有一台打印机,可从 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
我认为我目前首选的方式是:
使用 pdftoppm 将 PDF 文件转换为一系列图像。
$ pdftoppm 源.pdf 输出 -png
使用 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.pdf
→ c.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
基准测试的源代码可以在这里找到这里。