如何在不影响文件的情况下将字节插入 PDF 然后将其分开?

How to insert bytes into a PDF then separate it without affecting the file?

我正在尝试为一些 PDF 文件签名,应该很容易。但是我国制定了一套标准。按照这些标准,我必须将我的文件上传到第三方 API 并在 return 中获得签名文件 (SF)。如果我想验证这些文件,我会将文件和 SF 都上传到另一个第三方 API.

我想将这些文档发布给我的用户。每个文件旁边有一个 SF 是愚蠢的。所以首先我尝试使用 SF 将 PDF 签名插入到我的 PDF 文件中。但是 SF 是使用政府发明的算法生成的,PDF 标准不支持。

现在我的想法是:将SF插入我的PDF某处,如果用户要验证它,他将这个文件上传给我,我' ll 将 PDF 和 SF 分开,然后调用 API 进行验证。

现在的问题是:

  1. 在保持 PDF 可读性的同时在哪里插入字节?
  2. 如何确保分离后的PDF与原始PDF一模一样?

我正在使用 iText。感谢阅读和任何帮助。

您可以使用 iText 将附件添加到 PDF 文件。执着有两种。

  • 附件注释:页面上有一个可视对象(例如回形针),当用户单击该可视对象时,附件会打开。参见 File attachment annotation
  • 嵌入文件:这些是文档级附件。它们在页面上的任何位置都不可见,但大多数 PDF 查看器都有一个可以打开的 "attachment panel",最终用户将在那里看到附件。参见 embedded files

选择您最喜欢的附件类型,然后您可以使用 PdfStamper 将此类附件添加到您的 PDF 中。例如,参见 How to load a PDF from a stream and add a file attachment? (for an example in C#) or How to delete attachments in PDF using iText?(Java 中添加然后删除附件的示例)。

这个问题是不是和我提的问题重复了?不,当然不是,因为我在回答这些问题时写的示例 更改了原始 PDF 文档的字节。 当这些字节更改时,您的国家(一个国家/地区)强加的奇异签名没有使用 PAdES 中描述的真实数字签名而做出非常糟糕的决定)将会崩溃。 那个才是真正的问题:如何添加附件同时保留原始字节

这在我对问题 Why do PDFs change when processing them?

的回答中有解释

在这个问题中,我解释了如何在 append mode:

中操作 PDF
PdfStamper stamper = new PdfStamper(reader,
    new FileOutputStream(dest), '[=10=]', true);

PDF 文件如下所示:

%PDF-1.7
// Original PDF syntax
%%EOF

当我们使用 PdfStamper 时,我们通常会得到这样的文件:

%PDF-1.7
// Altered PDF syntax
%%EOF

当我们在追加模式下使用 PdfStamper 时,我们最终得到一个这样的文件:

%PDF-1.7
// Original PDF syntax
%%EOF
// Some new PDF syntax
%%EOF

换句话说:iText 没有触及原始语法:所有字节都被保留。为了获得原始字节,您需要删除所有字节,直到原始 %%EOF.

更新:

@mkl 添加了关于创建投资组合又名 portable collection 的评论。可移植集合是充当 ZIP 文件的 PDF。这些是一些例子:

您可以使用原始 PDF 作为封面,将签名文件作为嵌入文件。与我之前的建议相比,使用便携式集合的优势是最终用户不需要从他的 PDF 中丢弃字节。他可以使用 PDF 查看器从便携式集合中提取原始 PDF。