PDFPatcher icon indicating copy to clipboard operation
PDFPatcher copied to clipboard

保存pdf文件时,不勾选清理--清除复制、打印限制,也会移除编辑权限

Open Charltsing opened this issue 8 months ago • 0 comments

这个问题是5.5.14.0这个伪版本的iTextSharp\core\iTextSharp\text\pdf\PdfStamperImp.cs 代码中的bug。

if (reader.IsEncrypted() && append) 
{
    crypto = new PdfEncryption(reader.Decrypt);
}

这句代码只在追加的时候才会读取加密参数,所以在补丁丁里面直接保存pdf,就会丢失权限。

unethicalreading.zip 这是测试文件

在官方版本的5.5.13.4中,改成了 if (reader.IsEncrypted() && (append || PdfReader.unethicalreading))
这样也有bug,会造成保存pdf时,永远都会有加密。无法实现修改权限并删除加密提示的功能。

我反编译看了一个多小时代码,才发现这个问题。所以我增加了一个PdfReader.unethicalwriting参数

if (reader.IsEncrypted() && (append || !PdfReader.unethicalwriting))           
{
    crypto = new PdfEncryption(reader.Decrypt);
}

这样就可以通过设置PdfReader.unethicalwriting来决定是删除权限,还是保留权限。

至于pdf.RemoveUsageRights();和var form = pdf.Catalog.GetAsDict(PdfName.ACROFORM);这些删除权限的功能,对好多pdf是无效的。

从未来补丁丁的兼容性出发,我建议你在项目中直接使用官方的5.5.13.4的源代码,引用官方BouncyCastle.Cryptography包,这样方便修补ItextSharp中的若干bugs,也方便加上AES-V3支持(可以实现读写)。

这样还能方便大家共同调试iTextSharp中的问题。...

Charltsing avatar Apr 19 '25 15:04 Charltsing