Java 在分页符时打印JTextArea表单提要字符
我正在尝试使用Java打印服务API打印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
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()的所有优点和简单性。