如何防止 PDFBox 1.8 的打印在打印文档的顶部留下边距?
How to prevent PDFBox 1.8's print to leave a margin on the top of printed document?
我使用 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,但问题仍然存在。
我找到了这个解决方案:
PDFPageable p = new PDFPageable(pdf);
PDFPrintable printable = new PDFPrintable(pdf,Scaling.SCALE_TO_FIT);
job.setPageable(p);
job.setPrintable(printable);
应用正确的格式。如果我必须删除它,我将进行编辑,但现在,我将 post 全部放在 github 上:
GPierre-Antoine:Print_A4_APACHE_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;
}
}
我使用 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,但问题仍然存在。
我找到了这个解决方案:
PDFPageable p = new PDFPageable(pdf);
PDFPrintable printable = new PDFPrintable(pdf,Scaling.SCALE_TO_FIT);
job.setPageable(p);
job.setPrintable(printable);
应用正确的格式。如果我必须删除它,我将进行编辑,但现在,我将 post 全部放在 github 上: GPierre-Antoine:Print_A4_APACHE_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;
}
}