我有什么,我希望是一个简单的问题。 我尝试使用iTextSharp的修改某些PDF文件,但它似乎是iTextSharp的投入在文件末尾的XMP元数据被破坏的PDF文件的布局(我不是在PDF格式非常精通理解在所有原因)。
你可以从上面的文件似乎已被旋转的两个图像看到。 从看PDF文件,但是二元差别,唯一不同的似乎是在文件的结尾部分XMP元数据
我试着打开几个PDF浏览器中的文件(PDF苏门答腊,边浏览器和Adobe Acrobat)和所有表现出同样的怪事。
我想我有两个问题:a)如何能在PDF文件中,以便从只是有在文件的结尾XMP meteadata改变? B)我怎样才能使iTextSharp的不会产生这种输出? (iTextSharp的似乎只有做到这一点,当我添加/编辑内容,而不是如果我只是去掉JavaScript或类似)
<EDIT 1>
我使用的iTextSharp的代码是从岗位PdfContentStreamEditor(逐字)位置: https://stackoverflow.com/a/35915789/2535822
</ EDIT 1>
<编辑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>
你确实找到了一个bug PdfContentStreamEditor
我用这个答案 ,而其他问题需要一个知道如何禁用iText的一种具有特殊功能或怪癖(视情况而定)。
内容的旋转
这与内容在示例文档的旋转部分涉及PHA-Pro 8 - File.pdf
由OP提供。
正如你已经看到自己,旋转问题似乎与事实有关的页面的页面旋转不为0相连。
事实上,iText的PdfStamper
有一个特点,它在旋转的网页时会自动旋转一个适用于补充OverContent
或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.pdf
由OP提供。
你已经发现了一个bug 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');
}
如果一个呈现PdfWriter
到ToPdf
一个方法PdfString
和PdfWriter
使用加密的字符串内容越来越加密。 但这里的字符串写入流,而在这种情况下,不是个别的字符串必须进行加密,而是最终整个流。
这适用于由OP,因为提供的PDF
- 该PDF使用默认密码加密和
- 的OP使用编辑
PdfStamper
在附加模式使用相同的密码与原始文件进行加密的加法。
随着原代码,结果是这样的:
与固定的代码,它看起来像这样:
我可以回答你的第二个问题。 你正试图删除元数据是不应该被删除。 那您使用将添加元数据,不管你的代码做了什么AGPL版本的DLL。 您将无法使用的iText删除它,因为它是直接违反其许可条款。 请参考: https://itextpdf.com/AGPL
你必须突出提到的iText和包括在输出文件元数据的iText的版权和AGPL许可证。