Java:使用SimpleDoc打印PDF时无法设置页面大小

时间:2014-11-15 20:00:29

标签: java printing

我目前正在使用此代码打印文档(以字节数组形式传递)。重要的是要注意文档已经具有正确的大小(我用iText设置):

private void printReceipt(ByteArrayOutputStream baos) throws PrinterException {

    //Retrieve byte array (which is in fact the pdf file)
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    Doc pdfDoc = new SimpleDoc(bais, DocFlavor.INPUT_STREAM.AUTOSENSE, null);

    //Select the right printer
    String printerNameDesired = "Star TSP143 (STR_T-001)";
    PrintService[] service = PrinterJob.lookupPrintServices(); // list of printers
    DocPrintJob docPrintJob = null;

    for (int i = 0; i < service.length; i++) {
        if (service[i].getName().equalsIgnoreCase(printerNameDesired )) {
            docPrintJob = service[i].createPrintJob();
            break;
        }
    }

    //Print the byte array
    try {
        final HashPrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
        attrs.add(PrintQuality.HIGH);
        attrs.add(MediaSizeName.ISO_A8);
        docPrintJob.print(pdfDoc, attrs);
    } catch (PrintException ex) {
        ex.printStackTrace();
    }

    //Close the bytearray inputstream to prevent memory issues
    try {
        bais.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

    //Delete the pdfDoc to prevent memory issues
    pdfDoc =null;

}

此代码对我有用,唯一的问题是文档的高度不正确。我需要设置自定义页面大小。但是,我必须选择MediaSizeName,我自己无法设置自定义页面大小。我想设置页面格式如下:

PageFormat pf = new PageFormat();
pf.setOrientation(LANDSCAPE);
Paper paper = pf.getPaper();
paper.setSize(1.102 * 72, 3.504 * 72);
paper.setImageableArea(0, 10, 1.0 * 72, 3.4 * 72);
pf.setPaper(paper);

我不知道如何将此PageFormat添加到我的SimpleDoc中。我无法将我的SimpleDoc转换为这样的Printable:

PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(docPrintJob.getPrintService());

Book book = new Book();//java.awt.print.Book
book.append(SimpleDocConvertedToPrintable, pf);
job.setPageable(book);

job.print();

不幸的是,我无法让它发挥作用。我还考虑过在HashPrintRequestAttributeSet内设置自定义MediaSize,但我无法在任何地方找到它。

所以我的问题是:如何创建自定义MediaSize,或者是否可以更好更快地打印PDF而不将其保存到文件中?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我能够通过在iText中创建文档时拉伸文档的大小来解决这个问题。我认为它与DPI设置有关,但我无法在网上找到它。 iText中的大小设置如下:

document.setPageSize(new Rectangle(660, 625));

宽度(660)正好足以放在我的收据上(宽度= 80mm)。高度仅基于错误的试验。当收据变得更大(就更高的高度而言)时,打印机会神奇地打印更长的收据。任何人都可以告诉我为什么? pagesize设置为常量...