PDFBox 未在 javax.print api 上打印签名

PDFBox not printing signature over javax.print api

给定一个带签名的数字签名 PDF 文件,我想将此文档打印在纸上。

使用带有以下代码的 PDFBox 我能够打印文档,除了签名没有结束在薄薄的、漂白的死树纸上。它周围的文本定位不会改变。所以它似乎意识到那里应该有一些东西,但它没有被打印出来。

  import java.awt.print.PrinterJob;
  import javax.print.PrintService;
  import javax.print.attribute.HashPrintRequestAttributeSet;
  import org.apache.pdfbox.pdmodel.PDDocument;
  import org.apache.pdfbox.printing.PDFPageable;

  InputStream pdf = getPDFInputStreamSomeHow();
  PDDocument pdDocument = PDDocument.load(pdf);
  PDFPageable pageable = new PDFPageable(pdDocument);

  PrinterJob job = PrinterJob.getPrinterJob();
  job.setPrintService(service);
  job.setPageable(pageable);
  job.print(attrs);

似乎 PDFBox 确实支持这种签名,因为当我使用 org.apache.pdfbox.rendering.PDFRenderer 将页面呈现为 BufferedImage 时,签名就像在我的常规 PDF 中一样呈现reader(Acrobat 或 Evince)。

打印时如何让PDFBox正确渲染签名?我不想乱打印 BufferedImage,因为它会将文档分成多个打印作业,并让我对发送到打印机的渲染图像的质量负责。

您的问题的解决方法是使用具有非 0 值的 PDFPageable 的 4 参数构造函数:

public PDFPageable(PDDocument document, Orientation orientation, boolean showPageBorder, float dpi)

将第 4 个参数设置为一个有用的数字,如 300 会导致图像在给定的 DPI 下被光栅化。所以对你来说,电话是

PDFPageable pageable = new PDFPageable(pdDocument, Orientation.AUTO, false, 300);

正在问题 PDFBOX-3729 中跟踪打印问题的可能原因。该问题还有针对 windows 用户的另一种解决方法。