Java 使用iText加密PDF以禁止内容复制和打印
我尝试了这段代码来加密我的PDF文件,这样用户就不能仅仅为了测试而从PDF文件中复制内容,我知道有一些东西是OCR'ing:pJava 使用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
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:-!