我正在尝试在特殊类型的纸张上打印PDF,在这种纸张上内容的位置很重要,并且不允许移位。
我正在使用java.awt.print.PrinterJob
和org.apache.pdfbox.printing.PDFPrintable
:
public void printPDF(byte[] pdf) throws IOException, PrinterException {
MediaSize media = MediaSize.getMediaSizeForName(MediaSizeName.ISO_A4);
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(media.getMediaSizeName());
attributes.add(new MediaPrintableArea(
0, 0, media.getSize(1)[0], media.getSize(1)[1],
1
));
PrinterJob job = PrinterJob.getPrinterJob();
if (job.printDialog(attributes)) {
PageFormat pageFormat = (PageFormat) job.getPageFormat(attributes).clone();
Paper paper = pageFormat.getPaper();
paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight());
pageFormat.setPaper(paper);
PDDocument document = PDDocument.load(pdf);
PDFPrintable printable = new PDFPrintable(
document,
Scaling.ACTUAL_SIZE,
false,
0,
false
);
job.setPrintable(printable, pageFormat);
job.print(attributes);
}
}
原始PDF如下:
但是,已打印的已转移:
因此,我希望不打印虚线边框而不是整个文档。
不幸的是,我无法在不移动内容的情况下打印PDF。
答案 0 :(得分:0)
如果使用PrinterJob
方法设置了setPrintable
的内容,则在PrinterJob
内进行一些操作,并修改指定的PageFormat
,...
工作解决方案#1 :使用setPageable
和PDFPageable
,使用文档的页面格式进行打印:
public void printPDF(byte[] pdf) throws IOException, PrinterException {
PDDocument document = PDDocument.load(pdf);
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(document));
if (job.printDialog()) {
job.print();
}
}
工作解决方案#2 :使用可分页的setPageable
和Book
。 Book
使用指定的页面格式进行打印:
public void printPDF(byte[] pdf) throws IOException, PrinterException {
PDDocument document = PDDocument.load(pdf);
MediaSize media = MediaSize.getMediaSizeForName(MediaSizeName.ISO_A4);
PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
attributes.add(media.getMediaSizeName());
PrinterJob job = PrinterJob.getPrinterJob();
if (job.printDialog(attributes)) {
PageFormat pageFormat = (PageFormat) job.getPageFormat(attributes).clone();
Paper paper = pageFormat.getPaper();
paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight());
pageFormat.setPaper(paper);
PDFPrintable printable = new PDFPrintable(document, Scaling.ACTUAL_SIZE, false, 0, false);
Book book = new Book();
book.append(printable, pageFormat);
job.setPageable(book);
job.print(attributes);
}
}
其他解决方案:这是我对自己问题的回答。答案是基于在此问题上花费的数小时工作/调查,很幸运地找到了解决方案。
如果您知道下面发生了什么,并且可以提供更详细的答案,解释实际发生的事情以及PrinterJob
的工作原理如何,那么我会很高兴,并且很高兴为您提供更详细的答案。