首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止PDFBox 1.8的打印在打印文档的顶部留下空白?

如何防止PDFBox 1.8的打印在打印文档的顶部留下空白?
EN

Stack Overflow用户
提问于 2016-04-29 15:35:57
回答 1查看 2.3K关注 0票数 3

我使用PDFBox (1.8.12)从java打印pdf文档:

代码语言:javascript
复制
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,但问题仍然存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-04 15:26:34

我找到了这个解决方案:

代码语言:javascript
复制
PDFPageable p = new PDFPageable(pdf);
PDFPrintable printable = new PDFPrintable(pdf,Scaling.SCALE_TO_FIT);

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

应用正确的格式。如果我必须删除它,我将进行编辑,但现在,我将把全部内容发布在github:PDFBOX)上。

如果我犯了一个错误,请随时提出/评论/帮助。

在这里,我做了上述代码的摘录:

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36942385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档