如何防止PDFBox 1.8的打印在文档顶部留出边距?

3

我使用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,但问题仍然存在。
1个回答

1
我找到了这个解决方案:

PDFPageable p = new PDFPageable(pdf);
PDFPrintable printable = new PDFPrintable(pdf,Scaling.SCALE_TO_FIT);

job.setPageable(p);
job.setPrintable(printable);

为了应用正确的格式。如果必须删除它,我会进行编辑,但现在我将整个内容发布到github上: GPierre-Antoine:Print_A4_APACHE_PDFBOX)

如果我犯了错误,请随意fork /评论/帮助。

这里是我提取的代码:

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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接