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

时间:2010-05-09 20:51:43

标签: pdf ghostscript acrobat reportlab pypdf

我正在尝试从用户输入动态生成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压缩的某种开源替代品?这会导致我的问题吗?如果是这样,我可以使用任何库来修复我的代码中的原因吗?

1 个答案:

答案 0 :(得分:4)

第一句话:

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

有时你除了“重新油炸”之外别无选择......但在这里你 DO

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

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

  1. 下载一个以PostScript语言编写的小程序,可从Ghostscript源代码库获取:pdfinflt.ps
  2. 运行以下命令行:

    gswin32c.exe -- [c:/path/to/]pdfinflt.ps input.pdf output.pdf

  3. 更新:以上命令行原本是错误的 我把它作为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
    

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