ASP.NET Core 用密码加密 PDF
需要使用 itext-dotnet :https://github.com/itext/itext-dotnet
使用Nuget:
Install-Package itext
Install-Package itext.bouncy-castle-adapter
使用密码加密PDF:
public static bool EncryptPdf(string inputPath, string outputPath) { bool result = false; try { string pdfUserPassword = "1234"; string pdfOwnerPassword = "5678"; WriterProperties wp = new WriterProperties(); wp.SetStandardEncryption(Encoding.Default.GetBytes(pdfUserPassword), Encoding.Default.GetBytes(pdfOwnerPassword), EncryptionConstants.ALLOW_PRINTING, EncryptionConstants.ENCRYPTION_AES_256); using (FileStream pdfStream = new FileStream(outputPath, FileMode.Create)) { using (var existingPdf = new PdfReader(inputPath)) { using (PdfWriter newPdf = new PdfWriter(pdfStream, wp)) { using (PdfDocument pdfDocument = new PdfDocument(existingPdf, newPdf)) { pdfDocument.Close(); } } } } result = true; } catch (Exception e) { Console.WriteLine($"error:{e}"); } return result; }
EncryptionConstants 的值见文档:
在控制器调用后:
public IActionResult Index() { bool result = PdfHelper.EncryptPdf("F:\\pdf\\compressed.tracemonkey-pldi-09.pdf", "F:\\pdf\\compressed.tracemonkey-pldi-15.pdf"); return Content(result.ToString()); }
打开生成的 PDF ,提示口令:
输入用户口令后,看下文档的 属性 -- 安全性
和我们设置允许用户打印的权限一致
当我们进行其他操作时,会再次提示输入口令
如果输入的管理员口令,再次查看文档的 属性-- 安全性
可以发现功能可以使用
如果只是限制功能,设置用户密码为 NULL 就可以了,权限设置为 0,则禁止所有权限,写法如下:
wp.SetStandardEncryption(null, Encoding.Default.GetBytes(pdfOwnerPassword), 0, EncryptionConstants.ENCRYPTION_AES_256);
看下文档安全性:
上面可以看到,如果设置用户密码为 NULL,则文档不需要密码即可打开,权限按照程序设置为准
如果设置管理密码也为 NULL,则 iText 则会生成一个随机密码,iText的实现如下:
if (ownerPassword != null) { this.ownerPassword = ownerPassword; } else { this.ownerPassword = new byte[16]; EncryptionProperties.RandomBytes(this.ownerPassword); }
所以当自己也不想知道管理密码的时候,可以直接:
wp.SetStandardEncryption(null, null, 0, EncryptionConstants.ENCRYPTION_AES_256);
作者:sun8134
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。