【问题标题】:PDFBox - print encrypted filePDFBox - 打印加密文件
【发布时间】:2016-04-08 12:23:49
【问题描述】:

我正在尝试按照here 中的示例,通过打印来取消对使用 PDFBox 1.8.0 的一些认证 PDF 的保护。

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 打印机。 我在PDPageable class @ line 74 中收到一个 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 直接从操作系统打印到 PDF 打印机时,证书会从打印的 PDF 中删除,因此该过程有效。

【问题讨论】:

    标签: printing pdfbox


    【解决方案1】:

    您提到的示例适用于 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);
    

    这应该解决您问题的第二部分。在保存 PDF 文件时使用protect()。

    您不应使用 1.8.0。这是几年前的事了。如果必须使用 1.8,则使用当前版本,即 1.8.11。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2012-02-14
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      相关资源
      最近更新 更多