我们有一个 Web 应用程序,它生成报告并使用 iText 将其保存为 pdf。我们想阻止用户从这个文件中复制内容。我认为这可以通过将 pdf 内容转换为图像然后将该图像添加到 pdf 来实现,但似乎 iText 无法将 pdf 转换为图像。
有没有办法使用 iText 做到这一点?
我们有一个 Web 应用程序,它生成报告并使用 iText 将其保存为 pdf。我们想阻止用户从这个文件中复制内容。我认为这可以通过将 pdf 内容转换为图像然后将该图像添加到 pdf 来实现,但似乎 iText 无法将 pdf 转换为图像。
有没有办法使用 iText 做到这一点?
正如@YuriyGalanter 指出的那样,PDF 中的限制性权限主要在 PDF 中的加密上下文中定义,参见。PDF 规范ISO 32000-1:2008的第 7.6.3.1 节:
如果指定了密码或访问限制,则文档应加密,验证密码所需的权限和信息应存储在加密字典中。仅对文件附件进行加密的文档应使用与用户和所有者密码相同的密码。
使用正确的所有者密码打开文档应该允许完全(所有者)访问文档。这种无限制的访问包括更改文档密码和访问权限的能力。
使用正确的用户密码打开文档(或使用默认密码打开文档)应该允许根据文档加密字典中指定的用户访问权限执行附加操作。
因此,如果 PDF 使用所有者密码而不是用户密码进行加密,则任何人都可以打开 PDF,并受到加密期间选择的权限的限制。只有使用所有者密码打开该 PDF 的人才能无限制地访问该 PDF。
显然,这样的计划很容易被破坏,并且“保护措施被移除”。这取决于 PDF 处理软件的道德行为。
iText in Action - 2nd Edition第 12 章中的示例EncryptionPdf.java演示了如何使用 iText 应用加密。
该方法createPdf
说明了如何在创建新 PDF 时应用加密:
public void createPdf(String filename) throws IOException, DocumentException {
// step 1
Document document = new Document();
// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
writer.setEncryption(USER, OWNER, PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_128);
writer.createXmpMetadata();
// step 3
document.open();
// step 4
document.add(new Paragraph("Hello World"));
// step 5
document.close();
}
该方法encryptPdf
说明了如何加密现有 PDF:
public void encryptPdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.setEncryption(USER, OWNER,
PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
stamper.close();
reader.close();
}
这是上面提到的用户和所有者密码USER
。OWNER
该示例只设置了一个权限,PdfWriter.ALLOW_PRINTING
; 还有多个其他的,只需检查所有ALLOW_*
常量PdfWriter.