当前位置: 首页 > 知识库问答 >
问题:

PDFBox-打印加密文件

胡霖
2023-03-14
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打印到PDF打印机。我在PDPageable类@第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()进行检查时,权限仍然为空。

注意:当我直接从操作系统使用Microsoft Print to PDF打印机打印时,证书将从打印的PDF文件中删除,因此该过程正常工作。

共有1个答案

吴正祥
2023-03-14

您提到的示例是针对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()。

 类似资料:
  • 主要内容:加密PDF文档,示例在前一章中,我们已经看到了如何在PDF文档中插入图像。 在本章中,我们将学习如何加密PDF文档。 加密PDF文档 使用和类提供的方法加密PDF文档。 类用于通过为其分配访问权限来保护PDF文档。 使用此教程,您可以限制用户执行以下操作。 打印文档 修改文档的内容 复制或提取文档的内容 添加或修改注释 填写交互式表单域 提取文字和图形以便视障人士使用 汇编文件 打印质量下降 类用于向文档添加基于密码

  • 我是新的PDFBox,我有一个要求发送PDF到打印机时,它是打开的。我们使用PDFBox api生成PDF。我使用下面的代码尝试在打开时设置操作,但没有任何效果。请帮帮忙。我使用过不同的javascript,如window.print();this.print();打印();

  • 问题内容: 我正在尝试使用PDFBox专门为PDF添加水印。我已经能够使图像显示在每个页面上,但是它失去了背景透明度,因为它看起来好像PDJpeg将其转换为JPG。也许有一种使用PDXObjectImage的方法。 到目前为止,这是我写的内容: 问题答案: 更新的答案 (更好的版本,带有简单的水印方法,这要感谢下面的评论员和@okok的回答提供了输入) 如果您使用的是PDFBox 1.8.10或更

  • 我正在使用以下设置: > pdfbox 2.0.15 目标:呈现包含中文字符的pdf 问题:java.lang.IllegalArgument异常:U 674E在此字体的编码中不可用 我已经试过了: > 使用不同的字体支持汉字。最新的一款是KTC普通版。ttf 将字体设置为unicode,如下所述:Java:使用PDFBox将国家字符写入PDF,但是不推荐使用loadTTF方法。 使用Arial-

  • 问题内容: 我想使用PDFBox打印 由iText创建的 PDF文件 。我已经使用PDDocument类及其方法print()成功尝试了此操作。您可以在此处找到文档: http //pdfbox.apache.org/apidocs/。 (我正在使用此代码:) 方法print()很好用,但是 有一个问题:当我需要打印多个文件时,该方法要求我为每个文档选择打印机。 有什么办法只能设置一次打印机吗?

  • 这是一个我甚至无法在我们的测试环境中重现的错误——到目前为止,它只发生在生产环境中,需要运行一段时间才能发生(重启一段时间后就可以了)。 在打印PDF文件时,上述异常被抛出,在打印机队列中,我可以看到作业挂在错误状态。让我有点困扰的是,我打印的文件大小约为40 kb,打印队列显示它们约为1.4 MB,但也许这是正常的,我不知道。无论如何,我读了一两件关于这个异常的事情,但是有些事情不太对——应用程