PDFBox不通过javax.print api打印签名

时间:2017-09-01 11:58:52

标签: java printing pdfbox

鉴于带有签名的数字签名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阅读器中一样呈现( Acrobat或Evince)。

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

1 个答案:

答案 0 :(得分:1)

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

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用户提供了另一种解决方法。