将JTextArea换页字符打印为分页符

时间:2012-01-04 20:08:05

标签: java swing printing jtextarea

我正在尝试使用Java Print Service API打印JTextArea:

        BufferedReader br = new BufferedReader(new FileReader(new File(path)));
        JTextArea text = new JTextArea();
        PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
        PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();

        text.read(br, null);
        text.print(null, null, true, defaultService, pras, true);

从包含换页符(\ f)的文件中加载JTextArea。如何在本地打印机上将这些字符用作分页符?

2 个答案:

答案 0 :(得分:4)

public class PagedTextArea extends JTextArea implements Printable, Pageable {
    JTextArea singlePageTextArea;

    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
                throws PrinterException {
        if (singlePageTextArea == null) {

            // Copy attributes to the singlePageTextArea:
            singlePageTextArea = new JTextArea();
            singlePageTextArea.setBounds(getBounds());
        }

        String[] pages = getText().split("\f");
        if (pageIndex >= pages.length) {
            return Printable.NO_SUCH_PAGE;
        }
        singlePageTextArea.setText(pages[pageIndex]);
        singlePageTextArea.printAll(graphics);
        return Printable.PAGE_EXISTS;
    }


    @Override
    public int getNumberOfPages() {
        String[] pages = getText().split("\f");
        return pages.length;
    }

    @Override
    public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException {
        return new PageFormat();
    }

    @Override
    public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException {
        return this;
    }
}

打印:

            PrinterJob job = PrinterJob.getPrinterJob();
            job.setPrintable(pagedTextArea);
            PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();

            boolean ok = job.printDialog(pras);
            if (ok) {
                System.out.println("Printing...");
                try {
                    job.print();
                } catch (PrinterException ex) {
                    System.out.println("The job did not successfully complete");
                }
            } else {
                System.out.println("Could not print");
            }

您可能希望使用PageFormat对页面的x,y执行Graphics2D.translate。

答案 1 :(得分:1)

原始分页符可能基于固定间距打印机的计数。 JTextArea使用完全不同的方法来衡量基于FontMetrics的文本,这种方式因操作系统而异。我会忽略换行符,让JTextArea使用print()执行此操作。

修改:如果每张发票的长度不同,您可以将它们分成单独的文本区域,并append()Printable分隔为Book。您可以拥有implements Printable的内部类,或者您可以使用文本区域的getPrintable()方法。