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的Web打印方式详解 JAVA的Web打印方式是指在Web应用程序中实现打印功能的各种方法和技术。本文将主要介绍使用PageOffice、POI、jacob、html打印等方式来实现Web打印。 一、使用浏览器自带的打印功能直接打印 ...
在J2EE项目开发中,实现Web票据打印是一项常见的需求,尤其在财务、物流、电商等领域,用户可能需要通过浏览器直接打印出各种票据,如发票、收据、订单等。本文将详细介绍如何在IE浏览器环境下,利用Java技术进行Web...
可以java直接调用 热敏打印机无驱动 打印票据socket工具类 此demo为 芯烨/xprinter 可以参考变成手册, 完成任何自己想要的小票格式
JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统源码 JavaEE课程设计:票据管理系统...
1. **Java编程语言**:Java是一种广泛使用的面向对象的编程语言,具有跨平台特性,能够在多种操作系统上运行,如Windows、Linux和macOS。由于其强大的类库和API支持,Java是开发桌面应用和企业级应用的理想选择。 2...
4. **打印机API**:Java的PrintService API允许程序与本地打印机进行交互,选择打印机,设置打印参数,以及实际的打印操作。 5. **数据库连接**:如果程序需要存储历史订单或与服务器同步数据,可能会使用到Java的...
Java实现打印机精确打印示例。给那些需要java打印的朋友们。
1. 源代码文件:如.java或.cs文件,展示了如何编写打印代码。 2. 示例票据模板:可能是图片或文本文件,用于演示预期的打印效果。 3. 数据样本:如.csv或.json文件,用于填充测试票据数据。 4. 打印配置文件:可能...
精锐万能票据打印专家是精锐软件面向票据处理市场推出的一款专业票据打印软件,利用该软件可轻松打印现金支票、转帐支票、旅行支票、转账支票、贷记凭证、电汇凭证、信汇凭证、进账单、现金结款单、快递单、汇/本票...
本主题聚焦于使用JAVA连接打印机打印小票,通过三种不同的方法:POS命令、TSCLIB类库以及JAVA自带的类库来实现。下面将详细介绍这三种方式,并给出相关示例。 1. **POS命令**: POS(Point of Sale)命令是一种...
E8票据打印软件(万能票据打印软件)V9.16简体中文破解版
1. **Java语言基础**:Java是一种广泛使用的面向对象编程语言,具有跨平台特性,这意味着编写好的Java代码可以在任何支持Java的系统上运行。在本例中,Java是实现打印功能的编程语言。 2. **打印机驱动**:小票...
C#票据打印系统主要依赖于.NET Framework提供的类库,尤其是System.Drawing命名空间中的类,如Bitmap、Graphics、Font等,用于图像处理和文本绘制。同时,通过调用打印机驱动程序接口,实现与硬件设备的交互,将设计...
在本项目中,我们主要探讨的是如何使用Java编程语言来模拟一个ATM(Automated Teller Machine)自动取款机,并实现其中的关键功能——票据打印。ATM是银行系统的重要组成部分,它允许用户进行存款、取款、查询余额等...
E8票据打印软件是一款专为会计和出纳人员设计的高效工具,旨在简化支票和其他金融文档的填写和打印过程,减少错误并提高工作效率。这款软件具有多项实用特性,能够帮助财务人员规范管理工作,降低风险,确保资金安全...
在本文中,我们将深入探讨基于C# WinForm的票据打印技术,这主要涉及到Windows桌面应用程序开发和打印控制。"c# winform票据打印源代码"是开发者分享的一个项目,其核心在于提供了一种用于设计和打印各类票据的解决...
【票据神银行票据打印软件】是一款专为银行业务设计的高效打印工具,旨在帮助用户便捷地处理各种银行票据的打印工作。这款软件以其强大的功能、易用性和高度自定义的特性,深受用户喜爱。在使用过程中,理解并掌握...
本软件为“票据打印系统”的加密狗版。 功能实用、操作方便快捷是本软件最大的特点,并且支持最新票据(凭证)格式。主要功能如下: 1、打印界面:直观、真实、简洁,更好地实现了人机对话。 2、币 种:支持(人民币...
海杰票据打印系统是一款非常实用的支持多币种(人民币、美元、欧元、港币、日元)的票据打印软件,操作简单、功能实用的特点,是出纳人员的好助手。 功能介绍 1.直观、真实、简洁的界面更好地实现了人机对话。 2....
【Java金融项目开发-票据交换体系】在当前的金融行业中,票据交换体系是核心的组成部分,尤其是在我国银行业,随着技术的快速发展,票据处理已经呈现电子化和集约化的转变。全国票据影像交换系统的启用,标志着票据...