首页 文章

动态生成的PDF文件在除Adobe Reader之外的大多数读者中工作

提问于
浏览
2

我正在尝试从用户输入动态生成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
用于Windows的Foxscript阅读器用于Windows的ghostscript查看器
预览Mac

是否存在我应该知道的已知问题?我不知道究竟是什么“flate”,但是从互联网上我认为它是LZW用于PDF压缩的某种开源替代品?这会导致我的问题吗?如果是这样,我可以使用任何库来修复我的代码中的原因吗?

1 回答

  • 4

    第一句话:

    你的第二步有许多缺点 . 如果您将PDF转换回PostScript,然后再转换回PDF,您将失去质量 . 这个过程被称为“重新煎炸PDF”,并且通常对PDF专业人员不满意 . (原因是:结果文件可能看起来“模糊”,如扫描错误;文件可能已丢失其嵌入字体;文件可能已替换原始字体;文件肯定丢失了透明胶片;图像已更改分辨率;颜色已更改... . )

    有时你除了"re-frying"之外别无选择......但是你在这里 DO .

    如果您使用Ghostscript,您可以对PDF文件进行直接的PDF到PDF转换,并且不会发生内部隐藏的PostScript转换 . (这是Ghostscript很少知道的特性,因此这个答案也应该得到很多赞成;-P) .

    既然你想摆脱内部LZW压缩,这里是如何在Ghostscript中做到这一点:

    • 下载一个用PostScript语言编写的小实用程序,可从Ghostscript源代码库获得:pdfinflt.ps

    • 运行以下命令行:

    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重新油炸失去质量 .

    第二句话:

    我认为你应该用另一种工具做第4步,即 pdftk *** . 这样做的好处是可以完全避免完成步骤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
    

    您可能想知道 stampbackground 命令之间的区别 . 命令按照其名称建议:将PDF页面排序到前景或背景层 . 如果两个PDF都具有透明背景(而不是纯白色不透明),则结果在许多情况下看起来都是相同的 .

相关问题