我使用PDFBox (1.8.12)从java打印pdf文档:
PDDocument pdf = PDDocument.load(new File(args[0]));
PrinterJob job = PrinterJob.getPrinterJob();
PrintRequestAttributeSet attr_set = new HashPrintRequestAttributeSet();
attr_set.add(MediaSizeName.ISO_A4); // <<< supposedly prints in A4 format
attr_set.add(Sides.ONE_SIDED);
PDPageable p = new PDPageable(pdf);
job.setPageable(p);
PrintService ps = null;
for (PrintService i : PrintServiceLookup.lookupPrintServices(null,null)) {
if (i.getName().equals(args[1])) {
ps = i;
}
}
if (ps == null) {
try {
throw new SystemException(ErrorCode.NO_PRINTER_FOUND);
} catch (SystemException e) {
e.printStackTrace();
}
}
else
{
job.setPrintService(ps);
job.print(attr_set);
}问题是,印刷的文件有一个空白,我不知道为什么。我进行了测试,将pdf循环回pdf虚拟打印机,看起来是一样的,我认为这意味着PDFbox不会错误地处理pdf。
经过进一步的研究,印刷纸上的文字似乎被放大了,开始的更高,完成的比原来的更低(当我直接从具体的打印机打印)。
我打印的纸张是A4格式,所以我尝试像上面那样将格式设置为A4,但问题仍然存在。
发布于 2016-05-04 15:26:34
我找到了这个解决方案:
PDFPageable p = new PDFPageable(pdf);
PDFPrintable printable = new PDFPrintable(pdf,Scaling.SCALE_TO_FIT);
job.setPageable(p);
job.setPrintable(printable);应用正确的格式。如果我必须删除它,我将进行编辑,但现在,我将把全部内容发布在github:PDFBOX)上。
如果我犯了一个错误,请随时提出/评论/帮助。
在这里,我做了上述代码的摘录:
package com.pierreantoineguillaume;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaSizeName;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Optional;
public class BasicPrinter {
public static void main(String[] args) {
BasicPrinter basicPrinter = new BasicPrinter();
String printerName = "name of my printer";
String filename = "my file to print";
try {
Optional<PrintService> printService = basicPrinter.getMatchingPrintService(printerName);
basicPrinter.printA4(printService.get(), PDDocument.load(new File(filename)));
} catch (NoSuchElementException e) {
System.err.println("Could not locate printer " + printerName);
} catch (PrinterException e) {
System.err.println("Could not print file because some error occurred during the print job or a compatibility error with the service");
} catch (IOException e) {
System.err.println("Could not find file to print");
}
}
public void printA4(PrintService printer, PDDocument documentToPrint) throws PrinterException {
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(new PDFPageable(documentToPrint));
job.setPrintable(new PDFPrintable(documentToPrint, Scaling.SCALE_TO_FIT));
job.setPrintService(printer);
job.print(getA4Attributes());
}
public Optional<PrintService> getMatchingPrintService(String printerName) {
for (PrintService i : PrintServiceLookup.lookupPrintServices(null, getA4Attributes())) {
if (i.getName().equals(printerName)) {
return Optional.of(i);
}
}
return Optional.empty();
}
private PrintRequestAttributeSet getA4Attributes() {
PrintRequestAttributeSet attr_set = new HashPrintRequestAttributeSet();
attr_set.add(MediaSizeName.ISO_A4);
return attr_set;
}
}https://stackoverflow.com/questions/36942385
复制相似问题