我尝试使用此代码对我的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。
关于我做错了什么的想法?
答案 0 :(得分:1)
正如我对该问题的评论中所提到的,在NullPointerException
期间运行示例代码会产生stamper.close()
,这在您首次关闭PdfReader
时非常自然之后PdfStamper,
但后一种close()
方法会访问PdfReader
(现已关闭)。
当我按照关闭PdfReader
和PdfWriter
的顺序运行代码时,我会根据需要获得具有访问权限的正确结果文件:
PS:我使用的是iText 5.3.5版;如果撤消close()
调用的顺序对您的情况没有帮助,您可能需要从5.0.2版本进行更新。