PdfContentStreamEditor PDF文件的旋转图像(PdfContentStream

2019-10-31 06:16发布

我有什么,我希望是一个简单的问题。 我尝试使用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>

Answer 1:

你确实找到了一个bug PdfContentStreamEditor我用这个答案 ,而其他问题需要一个知道如何禁用iText的一种具有特殊功能或怪癖(视情况而定)。

内容的旋转

这与内容在示例文档的旋转部分涉及PHA-Pro 8 - File.pdf由OP提供。

正如你已经看到自己,旋转问题似乎与事实有关的页面的页面旋转不为0相连。

事实上,iText的PdfStamper有一个特点,它在旋转的网页时会自动旋转一个适用于补充OverContentUnderContent 。 如果你想添加直立的内容页面,而无需自己申请的旋转,使其直立此功能可以说是相当方便的。 在的情况下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');
}

如果一个呈现PdfWriterToPdf一个方法PdfStringPdfWriter使用加密的字符串内容越来越加密。 但这里的字符串写入流,而在这种情况下,不是个别的字符串必须进行加密,而是最终整个流。

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

  • 该PDF使用默认密码加密和
  • 的OP使用编辑PdfStamper在附加模式使用相同的密码与原始文件进行加密的加法。

随着原代码,结果是这样的:

与固定的代码,它看起来像这样:



Answer 2:

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

你必须突出提到的iText和包括在输出文件元数据的iText的版权和AGPL许可证。



文章来源: PdfContentStreamEditor rotating image on PDF file