Java 在分页符时打印JTextArea表单提要字符

Java 在分页符时打印JTextArea表单提要字符,java,swing,printing,jtextarea,Java,Swing,Printing,Jtextarea,我正在尝试使用Java打印服务API打印JTextArea: BufferedReader br = new BufferedReader(new FileReader(new File(path))); JTextArea text = new JTextArea(); PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); PrintService

我正在尝试使用Java打印服务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);

JTextArea是从包含表单提要字符(\f)的文件加载的。如何使这些字符在本地打印机上充当分页符?

原始分页符可能基于固定间距打印机的行数
JTextArea
基于不同操作系统的
FontMetrics
使用完全不同的文本测量方法。我会忽略换行,让
JTextArea
来处理它


编辑:如果每张发票的长度不同,可能您可以将其分隔为单独的文本区域,并将其
append()。您可以有一个实现可打印的
的内部类,或者可以使用文本区域的
getPrintable()
方法。

原始分页符可能基于固定间距打印机的行计数
JTextArea
基于不同操作系统的
FontMetrics
使用完全不同的文本测量方法。我会忽略换行,让
JTextArea
来处理它

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;
    }
}
编辑:如果每张发票的长度不同,可能您可以将其分隔为单独的文本区域,并将其
append()。您可以有一个实现可打印的
的内部类,也可以使用文本区域的
getPrintable()
方法

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执行图形2D。转换为页面的x,y

及列印:

            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执行图形2D。转换为页面的x,y。

原始分页符(换页字符)是根据数据/报表中的逻辑分页符生成的。考虑打印多个客户的逐项发票。每张发票的长度不同。生成的原始文本使用\f个字符来分隔客户端报告。是否有任何方法返回到报告的源?该报告是一个带有表单提要字符的纯文本文件。我可以访问本地文件系统上的文本文件。我还可以访问报表生成器,但我不想更改其原始文本输出。我将研究如何创建可打印内容并将其显示在一本书中。原始分页符(表单提要字符)是根据数据/报表中的逻辑分页符生成的。考虑打印多个客户的逐项发票。每张发票的长度不同。生成的原始文本使用\f个字符来分隔客户端报告。是否有任何方法返回到报告的源?该报告是一个带有表单提要字符的纯文本文件。我可以访问本地文件系统上的文本文件。我也可以访问报表生成器,但我不想更改它的原始文本输出。我将研究如何创建可打印文件并将其显示在一本书中。我已经实现了这个类,并多次尝试使其工作,但没有任何成功。也许你的回答可以更详细一点?我忘记了可分页界面;现在有点复杂了。扩展了代码。仍在尝试解决这一切。我相信我已经非常接近了,因为我得到了3页空白的页面,而我期望的是3页。谢谢你带我走了这么远,乔普!可能需要转换并缩放到pdfFormat.getImageableX/Y/Width/Height。到目前为止,我能在页面上正确打印任何内容的唯一方法是使用graphics.printString()。这不是最优的,因为它相当占用资源,并且需要计算页面高度,因为表单提要字符之间的某些部分可能是多个页面。这几乎消除了JTextArea.print()的所有优点和简单性。我已经实现了这个类,并多次尝试让它工作,但都没有成功。也许你的回答可以更详细一点?我忘记了可分页界面;现在有点复杂了。扩展了代码。仍在尝试解决这一切。我相信我已经非常接近了,因为我得到了3页空白的页面,而我期望的是3页。谢谢你带我走了这么远,乔普!可能需要转换并缩放到pdfFormat.getImageableX/Y/Width/Height。到目前为止,我能在页面上正确打印任何内容的唯一方法是使用graphics.printString()。这不是最优的,因为它相当占用资源,并且需要计算页面高度,因为表单提要字符之间的某些部分可能是多个页面。这几乎消除了JTextArea.print()的所有优点和简单性。