Java自从问世以来在各方面发展迅速,但是一直以来,打印输出是java最弱的方面。事实上,java1.0不支持任何打印功能。Java1.1在 java.awt包里包含了一个叫做PrintJob的类,但是这个类提供的打印功能十分粗糙和不可靠。当java1.2问世,它围绕 PrinterJob设计了一个完整独立的打印机制(叫做java2D printing API),并且在java.awt.print包里定义了一些新的类和接口。这些使得基于PrintJob打印机制(就是AWT printing)基本荒废,虽然PrintJob从未被抨击而且至少在这篇文章里仍然是一个提供技术的类。
在J2SE1.3里当PrintJob的功能扩展到可以通过在java.awt包里的JobAttributes 和PageAttributes两个类设定工程和页面的属性时发生了一些额外的改变。随着J2SE1.3的发布,打印功能相应的得到了完善;但是在混合使用这两种完全不同的打印机制的时候仍然存在一些问题。比如,这两种机制使用java.awt.Graphics这个类的一个接口来展现打印内容,意味着所有要打印的东西都必须用一张图片表示。另外,完善的PrintJob提供了很有限的工程相关属性的设置;这两种机制都没有办法通过程序来选择目标打印机。
Java打印最大的改变来自于J2SE1.4的发布带来的Java打印服务API。这个第三代Java打印支持接口突破了先前提到的局限性。因为新的API就是以前两种旧的打印机制定义的功能函数的一个父集。
下面是我通过这些API写的定位打印示例代码,希望对用java实现打印的朋友有一定的帮助!
在CentOS4.4,jdk1.6下测试通过。
package com.eadd.test.print;
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException;
import javax.print.Doc; import javax.print.DocFlavor; import javax.print.DocPrintJob; import javax.print.PrintException; import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.SimpleDoc; import javax.print.attribute.DocAttributeSet; import javax.print.attribute.HashDocAttributeSet; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.MediaSizeName; import javax.swing.JOptionPane;
/** * java定位打印,把打印内容打到指定的地方。 * * @author lyb * */ public class LocatePrint implements Printable { private int PAGES = 0;
private String printStr;
/* * Graphic指明打印的图形环境;PageFormat指明打印页格式(页面大小以点为计量单位, * 1点为1英寸的1/72,1英寸为25.4毫米。A4纸大致为595×842点);page指明页号 */ public int print(Graphics gp, PageFormat pf, int page) throws PrinterException { Graphics2D g2 = (Graphics2D) gp; g2.setPaint(Color.black); // 设置打印颜色为黑色 if (page >= PAGES) // 当打印页号大于需要打印的总页数时,打印工作结束 return Printable.NO_SUCH_PAGE; g2.translate(pf.getImageableX(), pf.getImageableY());// 转换坐标,确定打印边界 Font font = new Font("宋体", Font.PLAIN, 24);// 创建字体 g2.setFont(font); // 打印当前页文本 int printFontCount = printStr.length();// 打印字数 int printFontSize = font.getSize();// Font 的磅值大小 float printX = 595 / 2; // 给定字符点阵,X页面正中 float printY = 842 / 2; // 给定字符点阵,Y页面正中 float printMX = printX - (printFontCount * printFontSize / 2);// 打印到正中间 float printMY = printY - printFontSize / 2;// 打印到正中间 g2.drawString(printStr, printMX, printMY); // 具体打印每一行文本,同时走纸移位 g2.drawString(printStr, printMX - printFontSize * printFontCount, printMY + printFontSize); // 具体打印每一行文本,同时走纸移位 g2.drawString(printStr, printMX + printFontSize * printFontCount, printMY + printFontSize); // 具体打印每一行文本,同时走纸移位 g2.drawString(printStr, printMX, printMY + printFontSize * 2); // 具体打印每一行文本,同时走纸移位 return Printable.PAGE_EXISTS; // 存在打印页时,继续打印工作 }
// 打印内容到指定位置 public void printContent() { printStr = "打印测试内容";// 获取需要打印的目标文本 if (printStr != null && printStr.length() > 0) // 当打印内容不为空时 { PAGES = 1; // 获取打印总页数 // 指定打印输出格式 DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE; // 定位默认的打印服务 PrintService printService = PrintServiceLookup .lookupDefaultPrintService(); // 创建打印作业 DocPrintJob job = printService.createPrintJob(); // 设置打印属性 PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); // 设置纸张大小,也可以新建MediaSize类来自定义大小 pras.add(MediaSizeName.ISO_A4); DocAttributeSet das = new HashDocAttributeSet(); // 指定打印内容 Doc doc = new SimpleDoc(this, flavor, das); // 不显示打印对话框,直接进行打印工作 try { job.print(doc, pras); // 进行每一页的具体打印操作 } catch (PrintException pe) { pe.printStackTrace(); } } else { // 如果打印内容为空时,提示用户打印将取消 JOptionPane.showConfirmDialog(null, "Sorry, Printer Job is Empty, Print Cancelled!",
"Empty", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE); } }
public static void main(String[] args) { LocatePrint lp = new LocatePrint(); lp.printContent(); }
}
|
分享到:
相关推荐
二、Java定位打印 定位打印通常是指在输出时对文本的位置进行精确控制,使其按照指定的位置排列。在Java中,可以使用以下方式实现: 1. 换行符和空格:通过控制换行符(\n)和空格的数量,可以实现简单的文本定位。 ...
Java定位打印技术是一种在网页上实现精确控制打印内容布局的方法,尤其在报表或者发票等需要规范格式输出的场景中非常常见。在这个实例中,我们利用Java结合JSP(JavaServer Pages)来实现在浏览器中预览并打印指定...
Java打印最大的改变来自于J2SE1.4的发布带来的Java打印服务API。这个第三代Java打印支持接口突破了先前提到的局限性。因为新的API就是以前两种旧的打印机制定义的功能函数的一个父集。
在Java编程语言中,"定位打印"是一种技术,允许开发者精确控制输出内容在终端或打印机上的位置。这种技术常用于创建报表、表格或其他需要精确布局的文本输出。本篇文章将深入探讨如何使用Java实现定位打印。 首先,...
在 jdk1.4 中则可以通过 javax.print.PrintSerivceLookup 来查找定位一个打印服务对象。开始一个打印工作也可以通过多种方式实现:在 jdk1.4 之前可以通过 java.awt.print.PrintJob(jdk1.1 提供的,现在已经很少用了...
而在JDK 1.4中,可以通过`javax.print.PrintServiceLookup`查找并定位打印服务对象。 2. **启动打印作业**:在早期的JDK版本中,`java.awt.print.PrintJob`类的`print`或`printAll`方法用于启动打印作业,或者通过`...
##### 步骤1:定位打印服务 ```java PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); // 或者 PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); ``...
"Java证书打印工具类"就是一种专门用于简化证书打印过程的代码封装,它可以帮助开发者高效地完成证书模板的设计和文本的定位。下面我们将深入探讨这个工具类的核心功能、设计原理以及如何使用。 首先,我们要理解...
Java和前端代码都需要适当的错误捕获和日志记录,以便于定位和解决问题。 通过这个Java网页打印示例,开发者不仅可以学习到如何实现网页打印,还能接触到Web开发的全貌,包括后端服务、前端交互、数据管理以及文档...
Java报表打印是Java开发中一个重要的领域,尤其在企业级应用中,用于生成和打印各种数据报告。这个压缩包提供了一套源代码,使得开发者能够快速集成报表打印功能到自己的项目中,无需从零开始编写复杂的打印逻辑。...
在 jdk1.4 中则还可以通过 javax.print.PrintSerivceLookup 来查找定位一个打印服务对象。 2.需要开始一个打印工作。这也有几种实现方法:在 jdk1.4 之前可以通过 java.awt.print.PrintJob(jdk1.1 提供的,现在已经...
最后,我们可以在`GisMapTest.java`中编写测试代码,模拟几个信号源的位置和信号强度,调用上述`trilateration`方法进行定位,并打印出结果。 通过以上步骤,我们已经实现了基于JAVA的三角质心定位算法。需要注意的...
在Java环境下实现ZPL指令打印,可以方便地将打印任务集成到业务系统中。 本项目提供了Java实现斑马打印机ZPL指令打印的源码,可以直接运行,这对于开发者来说是一个非常实用的资源。以下将详细介绍相关知识点: 1....
而在jdk1.4中,开发者还可以利用`javax.print.PrintServiceLookup`来查找和定位合适的打印服务。 2. **启动打印任务**:在早期的Java版本中,通过`java.awt.print.PrintJob`的`print`或`printAll`方法,或者通过`...
当执行此程序时,它将发送一个GET请求到淘宝的IP定位服务,并打印出返回的JSON数据。记得解析返回的JSON,从中提取出所需的地理位置信息,例如城市、省份和国家等。 在`ipDingWeiTB`压缩包中,可能包含了示例代码、...
5. **定位默认打印服务**:使用`PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();`方法获取系统的默认打印服务。 6. **显示打印对话框**:调用`PrintService service = ServiceUI....
4. 将BitMatrix转换为图片,并定位在打印单的指定位置。 5. 如果需要,也可以生成条形码,同样使用Graphics2D绘制条形码的线条和间隔。 6. 添加其他信息,如收件人和寄件人的地址、时间戳等,可以使用Graphics2D的...
自JDK 1.4起,可以通过`javax.print.PrintServiceLookup`类查找和定位打印服务。 2. **启动打印作业**:早期版本中,可以通过`java.awt.print.PrintJob`类的`print`或`printAll`方法启动打印作业,也可以使用`java...