Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用iText加密PDF以禁止内容复制和打印_Java_Encryption_Itext - Fatal编程技术网

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

Java 使用iText加密PDF以禁止内容复制和打印,java,encryption,itext,Java,Encryption,Itext,我尝试了这段代码来加密我的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 { pri

我尝试了这段代码来加密我的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


你知道我做错了什么吗?

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

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


PS:我正在使用iText版本5.3.5;如果颠倒关闭调用的顺序对您的情况没有帮助,您可能需要从5.0.2版进行更新。

请同时提供生成的PDF。只需提供您希望允许的权限,而不是取消或合并权限即可。你为什么在那里使用否定?@mkl:这是你可以使用的:@owlstead:我试过使用PdfWriter.ALLOW_SCREENREADERS no negative,这给了我同样的问题…@jochenbbrecht我明天会在办公室里查看。但是你试过如果你什么都不允许会发生什么吗?屏幕阅读器也会做一些文本提取……我没有用5.0.2获得NPE,但我用5.3.5获得了它。由于以下错误,我仍然无法加密PDF:由以下原因引起:java.lang.ClassNotFoundException:org.bouncycastle.asn1.asn1。今晚我会用谷歌搜索这个问题的解决方案,你用的是哪款Bouncycastles jar?没关系,让它工作:bcprov-jdk14-1.47.jar和bcprov-ext-jdk14-1.47.jar是的,在一些5.3.x版本中,所需的BC版本从1.46更改为1.47。此外,我猜虽然您没有通过iText 5.0.2获得NPE,但stamper.close仍然无法在已关闭的PDF阅读器上正确盖章。感谢您明确的回答和巨大的帮助!你摇滚mkl:-!