如何替换pdf文件的每条流数据?

问题描述 投票:0回答:1

我正在处理 pdf 解密任务。我首选的解析/处理 pdf 的库是 iText。

例如,下面是来自加密pdf文件的流数据之一。如您所见,它包含两个过滤器:VendorPDFEncrypt 和 FlateDecode。 VendorPDFEncrypt 由pdf供应商提供,并提供相应的解密方法。

6 0 obj
<</Length 608/Filter[/VendorPDFEncrypt/FlateDecode]>>stream
encryptedBy_FlateDecode_VendorPDFEncrypt_data
endstream
endobj

我的目标是迭代每个流数据,然后解密它,从 Filter 中删除“VendorPDFEncrypt”字符串并重新计算长度(例如 608 -> 598)。目标流数据应如下所示。

6 0 obj
<</Filter[/FlateDecode]/Length 598>>stream
encryptedBy_FlateDecode_data
endstream
endobj

我的代码如下。我的问题是:

(1) 如何获取pdf对象总数?

(2) 如何替换流数据?

(3) 如何从过滤器中删除“VendorPDFEncrypt”并重新计算长度?

var pdf = new PdfReader(file);
int i = 0;

while (true)
{
    // TODO: need to find a better way to get the total count of pdf objects
    i++;
    if (i > 1000)
        break;

    PdfObject obj = pdf.GetPdfObject(i);

    if (obj != null && obj.IsStream())
    {
        PRStream encryptedStream = (PRStream)pdf.GetPdfObject(i);
        byte[] encryptedBytes = PdfReader.GetStreamBytesRaw(encryptedStream);
        byte[] decryptedContent = VendorDecrypt.__DecryptHelper(DecryptFileFormat.Buffer, key, random, encryptedBytes);

        // TODO: replace the original encrypted content with decryptedContent
        // decryptedContent = encryptedBy_FlateDecode_data
    }
}
c# pdf itext
1个回答
0
投票

(Q1)如何获取pdf对象总数?

A1) 在某些情况下,许多 PDF 实际上可以在没有总数的情况下工作,如果说文件没有被截断得太严重,但是在文件的尾端可以预期 10 例中的 9 例中的对象计数:-

trailer <</Size 15
表示条目 14 0 obj 应该在某处(实际上这意味着 16 或更多)包括标题和尾部以及任何增量或其他代

即使是密码加密的文件也应该有类似的条目,除非它是加密的!

/Size 12 /Type /XRef /W [1 2 1] >>stream
xÚÁ±@ Á{Gf†*PŠL¤¥hF?ÈùvJicÑ!,È|"ש1±úý3ÏÑXÃúÊ´ñBMÖ

A 1.5) 如何轻松提取流,如果您知道对象编号并且对象位置未加密,那么您可以轻松导出它们以适应并返回

程序用法:

pdftosrc <PDF-file> [<stream-object-number>]

如果我请求看起来像的对象 5

5 0 obj
<<
/Filter /FlateDecode
/Length 100
>>
stream
xœ3Ð375 =T†.¦œ…‰¡ž¥‘‰‰Br.W!¦¦\.#c > C„h²¨‰!œ™ƒ0E4ƒ+\K!h6ÃD҃͠õ=sÓS
\ò¹¹¹ ,.8
endstream

回应

0.750000 0.000000 0.000000 -0.750000 0.000000 841.920044 cm
q
0.000000 0.000000 m
230.720001 0.000000 l
230.720001 410.720001 l
0.000000 410.720001 l
h
W* n
q
230.720001 0.000000 0.000000 -410.720001 0.000000 410.720001 cm
/Image1 Do
Q
Q

(Q2)如何替换流数据?

A2) 当您有信心时,最安全的方法是在 DECIMAL 地址模式下使用十六进制编辑器,这样可以避免运行文件,并让您测量、剪切、粘贴、插入和覆盖 8 位二进制字节。 (并具有搜索/替换对象标志等能力)

还有允许导出流的 PDF COS 分析器,这里是 Apryse 的一个旧分析器(PDFtron/iText/Etc.),他们更为人所知的可能是 RUPS

此文件是打开密码(我不知道)因此所有原始数据都被编码为加密。

(Q3)如何从过滤器中删除“VendorPDFEncrypt”并重新计算长度?

A3) 编辑器具有查找和替换(=无)能力,并且对于少量计数,它很容易测量/修复变化。但对于多个条目,您可能需要解压缩文件以进行批量编辑。但是,由于您的重点是供应商加密,除非您知道解压密码,否则可能会更加困难。

清楚地看到所要求的最小样本以获得准确的答案,将有助于确定最佳方法。

© www.soinside.com 2019 - 2024. All rights reserved.