0

我有一个我希望是一个简单的问题。我正在尝试使用 iTextSharp 修改一些 PDF 文件,但是似乎 iTextSharp 放在文件末尾的 XMP 元数据正在破坏 PDF 文件的布局(而且我对 PDF 格式不太熟悉完全理解为什么)。

这是原始文档的一小部分 以及“已编辑”文档中的同一部分 您可以从上面的两张图片中看到,文档似乎已被旋转。然而,从将 PDF 文件视为二进制差异来看,唯一不同的似乎是文件末尾的一些 XMP 元数据

最后显示 XMP 元数据的文件的 DIFF 作为唯一的区别

我尝试在几个 PDF 查看器(Sumatra PDF、Edge Browser 和 Adob​​e Acrobat)中打开文件,都显示出同样的怪异。

我想我有两个问题:a) PDF 文件如何从文件末尾的 XMP 元数据中改变?b) 如何使 iTextSharp 不产生此输出?(iTextSharp 似乎只在我添加/编辑内容时执行此操作,而不是在我仅删除 Javascript 或类似内容时执行此操作)

<EDIT 1>
我用于 iTextSharp 的代码是来自此处帖子的 PdfContentStreamEditor(逐字):https
://stackoverflow.com/a/35915789/2535822 </EDIT 1>
<EDIT 2>
好的..似乎它不是 XMP 元数据。我通过使用摆脱了它:

pdfStamper.XmpMetadata = new byte[0];

但是,文件末尾仍然有一堆额外的数据

2 0 obj
<</Producer(PDFCreator 2.5.2.5233; modified using iTextSharp’ 5.5.13 ©2000-2018 iText Group NV \(AGPL-version\))/CreationDate(D:20171206173510+10'30')/ModDate(D:20180325144710+11'00')/Title(þÿ
endobj
404 0 obj
<</Length 0/Type/Metadata/Subtype/XML>>stream

endstream
endobj
405 0 obj
<</Length 3638/Filter/FlateDecode>>stream
xœÍZmÅ/6ÒZ2ÁÆ€
....

</编辑 2>

4

2 回答 2

1

我可以回答你的第二个问题。您尝试删除的元数据不应该被删除。无论您对代码做什么,您正在使用的 AGPL 版本的 DLL 都会添加该元数据。您将无法使用 iText 将其删除,因为这直接违反了他们的许可条款。请参考:https ://itextpdf.com/AGPL

您必须在显着位置提及 iText,并在输出文件元数据中包含 iText 版权和 AGPL 许可。

于 2018-03-25T04:10:22.287 回答
1

您确实在PdfContentStreamEditor我在此答案中使用的错误中发现了一个错误,而另一个问题需要知道如何禁用 iText 的特殊功能或怪癖(取决于具体情况)。

内容旋转

这部分处理PHA-Pro 8 - File.pdfOP 提供的示例文档中内容的轮换。

正如您已经看到的那样,旋转问题似乎与相关页面的页面旋转不为 0 的事实有关。

事实上,iTextPdfStamper有一个功能,在旋转页面的情况下会自动旋转添加到OverContentor的添加UnderContent。如果您想在页面中添加直立的内容,而无需自己应用旋转使其直立,此功能会非常方便。但是,在 的情况下PdfContentStreamEditor,我们从现有内容收到的所有坐标都已经考虑了适用的旋转。

因此,我们需要禁用此功能。PdfStamper可以使用以下属性来做到这一点RotateContents

using (PdfReader pdfReader = new PdfReader(source))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(dest, FileMode.Create, FileAccess.Write), (char)0, true))
{
    pdfStamper.RotateContents = false;
    PdfContentStreamEditor editor = new PdfContentStreamEditor();

    for (int i = 1; i <= pdfReader.NumberOfPages; i++)
    {
        editor.EditPage(pdfStamper, i);
    }
}

文字打乱

这部分处理AS62061-2006.pdfOP 提供的示例文档中的文本加扰。

您在PdfContentStreamEditor. 它的Write方法包含这个循环:

foreach (PdfObject pdfObject in operands)
{
    pdfObject.ToPdf(canvas.PdfWriter, canvas.InternalBuffer);
    canvas.InternalBuffer.Append(operands.Count > ++index ? (byte) ' ' : (byte) '\n');
}

它应该是

foreach (PdfObject pdfObject in operands)
{
    pdfObject.ToPdf(null, canvas.InternalBuffer);
    canvas.InternalBuffer.Append(operands.Count > ++index ? (byte) ' ' : (byte) '\n');
}

如果向aPdfWriterToPdf方法提出PdfStringPdfWriter使用加密,则字符串内容将被加密。但是在这里,字符串被写入流,在这种情况下,不必加密单个字符串,而是最终加密整个流。

这适用于 OP 提供的 PDF,因为

  • PDF 使用默认密码加密,并且
  • OP 使用PdfStamper附加模式编辑,该模式使用与原始文件相同的密码对添加的内容进行加密。

使用原始代码,结果如下所示:

破碎的页面内容

使用固定代码,它看起来像这样:

正确的页面内容

于 2018-03-25T21:14:11.217 回答