2013-05-07 98 views
1

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

有没有一种方法可以使用iText来做到这一点?

+1

即使图像也不会阻止复制,它们可以很容易地被OCR,因此它不是一种真正的保护。 – 2013-05-07 18:16:39

+0

@YuriyGalanter没错。有没有其他方法可以防止使用iText复制PDF文件的内容? – AndyT 2013-05-07 18:29:00

+0

我还没有广泛地起诉iText,但它看起来像加密是票 - 看看这个线程是否有帮助:http://www.coderanch。COM/T/329511/JAVA/JAVA /撤销的许可 - 保存 - 复制PDF – 2013-05-07 18:36:04

回答

3

正如@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(); 
} 

这里USEROWNER是用户和上面提到的所有者密码。

样品只设置一个权限,PdfWriter.ALLOW_PRINTING;还有其他几种,只需检查所有ALLOW_*PdfWriter.的常量

+0

感谢@mkl , 有用。我想如果使用setEncryption(),那么需要输入密码才能打开文件。但只是发现,如果只提供OWNER密码,那么打开文件时不需要密码,并且在权限中不包括PdfWriter.ALLOW_COPYING,我们的目的也被解决了。再次感谢 :) – AndyT 2013-05-07 22:22:35