解决方案

解决方案

您知道当您有一个 pdf 文档时,它是文档的扫描件,而且是一个非常大的文件,因为它只存储扫描文档的图片?

有 OCR 工具可以帮助您制作仅存储文本的正确文档吗?

好吧,我需要相反的!假设我有一个完美的 pdf 文档pdflatex,我需要将它变成一个“巨大”的 pdf,它在纸上打印时看起来完全一样(具有一定的 dpi 值),但只是原始图片。

我最初的想法是将 pdf 转换为一系列 JPG,然后再转换回 PDF,但也许有一些规范的方法?


如果您想知道为什么我想做这样的事情:我目前被网络打印机困住了,它不是由我维护的,并且会随机丢弃打印文件中的字符!因此,在有人弄清楚那里出了什么问题之前,我希望将此作为解决方法。

答案1

您可以测试基于图像的 PDF 是否也被污染。首先将 PDF 转换为(多页)TIFF,例如鬼脚本:

gs -sDEVICE=tiffg4 -o sample.tif sample.pdf

然后将 TIFF 转换为 PDF,例如:

tiff2pdf -z -f -F -pA4 -o sample-img.pdf sample.tif

这会生成一个 PDF 文件,其中页面是图像而不是文本。

或者,如果您的系统支持打印 TIFF 文件,请尝试直接打印。

还有一个pdf2ps将 PDF 转换为 PS 的选项,如果可行的话,可能会更好。

答案2

我是这样做的迪米特里中描述的评论通过使用pdf2psps2pdf.

.ps首先,我使用命令将 pdf 转换为某种格式

pdf2ps my_file.pdf my_file.ps

然后将其转换回pdf格式

ps2pdf my_file.ps my_file.pdf

这样我就得到了原始 pdf 的光栅化版本,其中内容实际上是图像。希望这可以帮助。

答案3

解决方案

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

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

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

基准

可以看到,上面的解法是最快的,只输给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

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

答案4

接受的答案应该涵盖大多数用例。然而,我发现自己处于想要光栅化的情况到特定的分辨率这个答案pdftoppm一个类似的问题向我介绍了可以产生最佳质量结果的工具。

一个简单的用法示例是

pdftoppm input.pdf output -tiff

这会生成名为 的文件output-X.tif,其中X对应于 PDF 文件的页码。

相关内容