防止复制使用iText生成的pdf内容

时间:2013-05-07 18:07:41

标签: pdf pdf-generation itext

我们有一个Web应用程序,它生成一个报告并使用iText将其保存为pdf。我们希望阻止用户复制此文件中的内容。我认为这可以通过将pdf内容转换为图像然后将该图像添加到pdf来实现,但似乎iText无法将pdf转换为图像。

有没有办法可以使用iText做到这一点?

1 个答案:

答案 0 :(得分:3)

正如@YuriyGalanter所指出的,PDF中的限制性权限主要是在PDF加密的上下文中定义的,参见PDF规范ISO 32000-1:2008的第7.6.3.1节:

  

如果指定了密码或访问限制,则应对文档进行加密,并且验证密码所需的权限和信息应存储在加密字典中。仅加密文件附件的文档应使用与用户和所有者密码相同的密码。

     
      
  • 使用正确的所有者密码打开文档应该允许完全(所有者)访问文档。这种无限制访问包括更改文档密码和访问权限的功能。

  •   
  • 使用正确的用户密码打开文档(或打开带有默认密码的文档)应该允许根据文档加密字典中指定的用户访问权限执行其他操作。

  •   

因此,如果使用所有者密码加密PDF但没有用户密码,则任何人都可以打开PDF并受加密期间选择的权限限制。只允许使用其所有者密码打开该PDF的用户可以无限制地访问PDF。

显然,这样的方案很容易被打破并且保护被删除了。这取决于PDF处理软件的道德行为。

EncryptionPdf.java第12章中的示例iText in Action — 2nd Edition演示了如何使用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();
}

此处USEROWNER是上述用户和所有者密码。

该示例仅设置一个权限PdfWriter.ALLOW_PRINTING;还有其他多个,只需检查ALLOW_*

的所有PdfWriter.常量