2

我尝试使用此代码来加密我的 PDF,因此用户无法从 PDF 中复制内容(仅用于测试,我知道有些东西是 OCR'ing :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。

关于我做错了什么有什么想法吗?

4

1 回答 1

1

正如我对问题的评论中所提到的,按原样运行示例代码会导致--- 这是很自然的,因为您首先关闭NullPointerException然后关闭,但后一种方法访问stamper.close()PdfReaderPdfStamper,close()PdfReader(现在已经关闭)进行工作。

PdfReader但是,当我按照关闭和反转的顺序运行您的代码时PdfWriter,我会得到一个具有所需访问权限的正确结果文件:

受保护 PDF 的文档属性显示打印和复制已禁用

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

于 2013-02-11T09:22:11.433 回答