2

我正在尝试从用户输入动态生成 PDF,我基本上打印用户输入并将其覆盖在我没有创建的现有 PDF 上。

它有效,但有一个主要例外。Adobe Reader 在 Windows 或 Linux 上无法正确阅读。我手机上的 QuickOffice 也不读取它。所以我想我会追踪我创建文件的路径 -

1 - 使用 LZW 编码的 Adob​​e Distiller 制作的背景 PDF 1.2的原始 PDF 。
我没有做这个。

2 - 使用 Ghostscript 制作的背景PDF 1.4 的 PDF。
我在上面使用了 pdf2ps 然后 ps2pdf 来剥离 LZW,以便 reportlab 和 pyPDF 库能够识别它。请注意,此文件在 Adob​​e Reader 中看起来“模糊”,就像扫描错误,但在其他阅读器中看起来不错。

3 -用户输入文本的 PDF 格式,可与
用户输入的 Reportlab 制作的背景 PDF 1.3 相结合。在我尝试过的每个阅读器中都可以正常打开并且看起来不错。

4 - 使用 PyPDF在 2 和 3 上的功能完成的 PDF PDF 1.3。
mergePage()

无法打开:
Adob​​e Reader for Windows
Adob​​e Reader for Linux
QuickOffice for Android

在以下位置完美打开:
Google Docs' PDF 查看器 on the web
evince for linux
ghostscript viewer for linux Foxit reader for Windows
Preview for Mac

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

4

1 回答 1

4

第一点:

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

有时你别无选择,只能“重新油炸”……但在这里你可以

如果您使用 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

更新:这链接到 pdfinflt.ps 的最新版本。它已被此提交消息删除:

删除 pdfinflt.ps 和 pdfwrite.ps
----------------------------------
pdfwrite 仅(据我所知)由 pdfinflt.ps 使用,它说:

% 它还没有准备好进入黄金时段,但任何人都可以使用
% 要解决这个问题。
%
% 主要问题是:
%
% 1. 有时写入的 PDF 文件会损坏。当他们在
% 损坏,GS 出现外部参照问题。
%
% 这个问题实际上是由于 lib/pdfwrite.ps 甚至
% 当没有转换完成时,文件可能是坏的。

由于它不起作用,我们可以使用 MuPDF(确实有效)
同样的任务,我选择删除这两个文件。

生成的 PDF 将解压缩其所有内部数据流,而不会通过您的PDF ==> PS ==> PDF重炸而降低质量。

第二条评论:

我认为您应该使用不同的工具进行第四步,即pdftk***。这样做的好处是让您完全免于执行步骤 1. 和 2.。

pdfk(PDF ToolKit,在此处下载)是一个命令行实用程序,可在 Linux、Unix ( pdftk) 和 Windows ( pdftk.exe) 上使用,它可以在 PDF 上做很多事情,包括将两个 PDF 的页面相互叠加。这是我建议您使用的。pdftk 可以覆盖步骤“3”中的 PDF。一次下载到您的原始 PDF(反之亦然),而无需先对每个 PDF 进行放气或 de-LZW。

以下是供您测试的命令:

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

您可能想知道stampandbackground命令之间的区别。这些命令正如其名称所暗示的那样:将 PDF 页面排序到前景层或背景层。如果两个 PDF 都具有透明背景(而不是纯白色不透明),则结果在许多情况下看起来相同。

于 2010-08-09T08:27:59.513 回答