使用iText加密PDF以禁止内容复制和打印

时间:2013-02-09 19:08:44

标签: java encryption itext

我尝试使用此代码对我的PDF进行加密,以便用户无法复制PDF中的内容(仅用于测试,我知道有些内容为OCR:p)

import java.io.FileOutputStream;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;

public class EncryptPDF {

private static final String INPUT_FILENAME = "/tmp/test.pdf";
private static final String OUTPUT_FILENAME = "/tmp/test_encrypted.pdf";
private static final String USER_PASSWORD = "";
private static final String OWNER_PASSWORD = "foobar";

public static void main(String[] args) {
    PdfReader reader = null;
    FileOutputStream out = null;
    PdfStamper stamper = null;

    try {
        // Define input
        reader = new PdfReader(INPUT_FILENAME);

        // Define output
        out = new FileOutputStream(OUTPUT_FILENAME);

        // Encrypt document
        stamper = new PdfStamper(reader, out);
        stamper.setEncryption(USER_PASSWORD.getBytes(), OWNER_PASSWORD.getBytes(), ~(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING), PdfWriter.STANDARD_ENCRYPTION_128);
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        if (stamper != null) {
            try {
                stamper.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        if (out != null) {
            try {
                out.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

}
}

...但是当我打开PDF时,我仍然可以从中选择内容。我正在使用iText 5.0.2。

关于我做错了什么的想法?

1 个答案:

答案 0 :(得分:1)

正如我对该问题的评论中所提到的,在NullPointerException期间运行示例代码会产生stamper.close(),这在您首次关闭PdfReader时非常自然之后PdfStamper,但后一种close()方法会访问PdfReader(现已关闭)。

当我按照关闭PdfReaderPdfWriter的顺序运行代码时,我会根据需要获得具有访问权限的正确结果文件:

document properties of protected PDF showing print and copy as disabled

PS:我使用的是iText 5.3.5版;如果撤消close()调用的顺序对您的情况没有帮助,您可能需要从5.0.2版本进行更新。