我正在尝试从用户输入动态生成PDF,我基本上打印用户输入并将其覆盖在我未创建的现有PDF上。
它有效,但有一个主要例外。 Adobe Reader无法在Windows或Linux上正确读取它。我的手机上的QuickOffice也没有读取它。所以我想我会追踪创建文件的路径 -
1 - Original PDF of background
PDF 1.2使用Adobe Distiller使用LZW编码制作。我没有做到这一点。
2 - PDF of background
PDF 1.4使用Ghostscript制作。我在上面使用pdf2ps然后使用ps2pdf去除LZW,以便reportlab和pyPDF库识别它。请注意,在Adobe Reader中,此文件看起来像“模糊”,就像扫描不好一样,但在其他读者中看起来很好。
3 - PDF of user-input text formatted to be combined with background
PDF 1.3使用Reportlab从用户输入制作。在我尝试过的每一位读者中都能正常打开并且看起来很好。
4 - Finished PDF
PDF 1.3由PyPDF的mergePage()
函数在2和3上制作。
不打开:
适用于Windows的Adobe Reader
适用于Linux的Adobe Reader
适用于Android的QuickOffice
完美打开:
网络上的Google Docs'PDF查看器
evince for linux
适用于linux的ghostscript查看器
适用于Windows的福昕阅读器
预览Mac
我是否应该知道有哪些已知问题?我不知道究竟是什么“flate”,但是从互联网上我得知它是LZW用于PDF压缩的某种开源替代品?这会导致我的问题吗?如果是这样,我可以使用任何库来修复我的代码中的原因吗?
答案 0 :(得分:4)
你的第二步有许多缺点。如果您将PDF转换回PostScript,然后再转换回PDF,您将失去质量。这个过程被称为“重新煎炸PDF”,并且通常对PDF专业人员不满意。 (原因是:结果文件可能看起来“模糊”,如扫描错误;文件可能已丢失其嵌入字体;文件可能已替换原始字体;文件肯定丢失了透明胶片;图像已更改分辨率;颜色已更改... 。)
有时你除了“重新油炸”之外别无选择......但在这里你 DO 。
如果您使用Ghostscript,您可以对PDF文件进行直接的PDF到PDF转换,并且不会发生内部隐藏的PostScript转换。 (这是Ghostscript很少知道的特性,因此这个答案也应该得到很多赞成;-P)。
既然你想摆脱内部LZW压缩,下面是如何在Ghostscript中做到这一点:
运行以下命令行:
gswin32c.exe -- [c:/path/to/]pdfinflt.ps input.pdf output.pdf
更新:以上命令行原本是错误的
我把它作为gswin32c.exe -- [c:/path/to/]pdfinflt.ps output.pdf input.pdf
给了它
这是错误的输入和输出顺序。我的错!对此感到抱歉。
生成的PDF将解压缩其所有内部数据流,而不会通过 PDF ==>降低质量。 PS ==> PDF 重新油炸。
我认为你应该使用不同的工具,即pdftk
***来完成第4步。这样做的好处是可以完全避免完成第1步和第2步。
pdfk(PDF ToolKit,download here)是一个命令行实用程序,可在Linux,Unix(pdftk
)和Windows(pdftk.exe
)上使用,它可以在PDF上执行很多操作,包括将两个PDF的页面重叠在一起。这是我建议你使用的。 pdftk可以覆盖步骤“3”中的PDF。一次性使用原始PDF(反之亦然),无需首先对每个PDF进行反演或删除。
以下是您要测试的命令:
pdftk.exe ^
original.pdf ^
background pdf-from-userinput-step3.pdf ^
output merged.pdf
pdftk.exe ^
pdf-from-userinput-step3.pdf ^
background original.pdf ^
output merged.pdf
pdftk.exe ^
original.pdf ^
stamp pdf-from-userinput-step3.pdf ^
output merged.pdf
pdftk.exe ^
pdf-from-userinput-step3.pdf ^
stamp original.pdf ^
output merged.pdf
您可能想知道stamp
和background
命令之间的区别。命令按照其名称建议:将PDF页面排序到前景或背景层。如果两个PDF都具有透明背景(而不是纯白色不透明),那么在许多情况下,结果看起来都是一样的。