PDFBox - 打印加密文件
PDFBox - print encrypted file
我正在尝试通过打印取消对某些使用 PDFBox 1.8.0 的认证 PDF 的保护,遵循 here 中的示例。
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.IOException;
import javax.print.PrintException;
import javax.print.PrintService;
import org.apache.log4j.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPageable;
public class PDFPrinter {
private static final Logger LOGGER = Logger.getLogger(PDFPrinter.class);
public static void main(String[] args) throws IOException, PrinterException, PrintException {
LOGGER.info("Running...");
PDDocument pdDocument = PDDocument.load("C:\_APPS\input.pdf");
PrinterJob printerJob = PrinterJob.getPrinterJob();
PrintService printService = null;
if (printerJob.printDialog()) {
printService = printerJob.getPrintService();
LOGGER.info("Using printer: " + printService.getName());
}
printerJob.setPageable(new PDPageable(pdDocument));
printerJob.print();
pdDocument.close();
}
}
我正在使用 Microsoft Print to PDF 打印机。
我在第 74 行 PDPageable class 中收到 NPE,说我没有在此文档上设置访问权限:
java.lang.NullPointerException
at org.apache.pdfbox.pdmodel.PDPageable.<init>(PDPageable.java:74)
at org.apache.pdfbox.pdmodel.PDPageable.<init>(PDPageable.java:96)
at com.util.pdf.decrypt.Main.decryptAndOcr(Main.java:179)
at com.util.pdf.decrypt.Main.main(Main.java:82)
检查 pdDocument.getCurrentAccessPermission()
后确实为空。
所以我尝试手动设置一些没有用户名或密码的访问权限,只是打印权限:
AccessPermission accessPermission = new AccessPermission();
accessPermission.setCanPrint(true);
StandardProtectionPolicy spp = new StandardProtectionPolicy("", "", accessPermission);
try {
pdDocument.protect(spp);
} catch (BadSecurityHandlerException bhe) {
bhe.printStackTrace();
}
但是使用pdDocument.getCurrentAccessPermission()
检查时权限仍然为空。
问:如何设置PDF的打印权限?
注意:当我使用 Microsoft Print to PDF 打印机直接从 OS 打印时,证书已从打印的 PDF 中删除,因此该过程有效。
您提到的示例是针对 2.0 的。要么使用 2.0(而不是 1.8),要么在 1.8 中这样做:
PDDocument doc = PDDocument.load(new File("..."));
if (doc.isEncrypted())
{
doc.openProtection(new StandardDecryptionMaterial("password"));
}
或使用这个
PDDocument doc = PDDocument.loadNonSeq(new File("..."), null);
这应该可以解决您问题的第二部分。 protect() 将在您保存 PDF 文件时使用。
您不应该使用 1.8.0。这是好几年了。如果一定要用1.8,那就用现在的版本,也就是1.8.11。
我正在尝试通过打印取消对某些使用 PDFBox 1.8.0 的认证 PDF 的保护,遵循 here 中的示例。
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.IOException;
import javax.print.PrintException;
import javax.print.PrintService;
import org.apache.log4j.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPageable;
public class PDFPrinter {
private static final Logger LOGGER = Logger.getLogger(PDFPrinter.class);
public static void main(String[] args) throws IOException, PrinterException, PrintException {
LOGGER.info("Running...");
PDDocument pdDocument = PDDocument.load("C:\_APPS\input.pdf");
PrinterJob printerJob = PrinterJob.getPrinterJob();
PrintService printService = null;
if (printerJob.printDialog()) {
printService = printerJob.getPrintService();
LOGGER.info("Using printer: " + printService.getName());
}
printerJob.setPageable(new PDPageable(pdDocument));
printerJob.print();
pdDocument.close();
}
}
我正在使用 Microsoft Print to PDF 打印机。 我在第 74 行 PDPageable class 中收到 NPE,说我没有在此文档上设置访问权限:
java.lang.NullPointerException
at org.apache.pdfbox.pdmodel.PDPageable.<init>(PDPageable.java:74)
at org.apache.pdfbox.pdmodel.PDPageable.<init>(PDPageable.java:96)
at com.util.pdf.decrypt.Main.decryptAndOcr(Main.java:179)
at com.util.pdf.decrypt.Main.main(Main.java:82)
检查 pdDocument.getCurrentAccessPermission()
后确实为空。
所以我尝试手动设置一些没有用户名或密码的访问权限,只是打印权限:
AccessPermission accessPermission = new AccessPermission();
accessPermission.setCanPrint(true);
StandardProtectionPolicy spp = new StandardProtectionPolicy("", "", accessPermission);
try {
pdDocument.protect(spp);
} catch (BadSecurityHandlerException bhe) {
bhe.printStackTrace();
}
但是使用pdDocument.getCurrentAccessPermission()
检查时权限仍然为空。
问:如何设置PDF的打印权限?
注意:当我使用 Microsoft Print to PDF 打印机直接从 OS 打印时,证书已从打印的 PDF 中删除,因此该过程有效。
您提到的示例是针对 2.0 的。要么使用 2.0(而不是 1.8),要么在 1.8 中这样做:
PDDocument doc = PDDocument.load(new File("..."));
if (doc.isEncrypted())
{
doc.openProtection(new StandardDecryptionMaterial("password"));
}
或使用这个
PDDocument doc = PDDocument.loadNonSeq(new File("..."), null);
这应该可以解决您问题的第二部分。 protect() 将在您保存 PDF 文件时使用。
您不应该使用 1.8.0。这是好几年了。如果一定要用1.8,那就用现在的版本,也就是1.8.11。