Java定位打印 (有BUG,当宽>高时报错)

java 设置纸张大小_JAVA 打印,自定义纸张大小 package news;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.print.Book;import java.awt.print.PageFormat;import java.awt.print.Paper;impo... 阅读详情
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下测试通过。

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();

    }

}
如何快速定位BUG?BUG定位技巧及测试人员定位的N板斧 很多测试人员可能会说,我的职责就是找到bug,至于找原因并修复,那是开发的事情,关我什么事?好,我的回答是,如果您只想做一个测试人员最基本最本分的事情,那么可以这么想。但是,如果您想要在测试甚至开发的道路上长足发展,就要知其所以然。 阅读详情

相关推荐

Java打印小票自定义小票纸张大小,分辨率

自定义小票打印,通过打印机名称打印,设置纸张大小,分辨率问题

java mediasize_java mediasizename自定义纸张问题

excel中自定义纸张大小我在设计表格打印程序的过程中,需要一个excel的自定义页面大小,本来以为很简单的问题用了一个多小时也没有解决,经过多次的试验,终于知道excel中不像word那样,它没有这方面的设置。如果我们一定要使用这个设置,该怎么办呢?以下的方法为解决这样问题的通用办法。 特殊的方法将在最后中标注出来。本方法适用于windows 2000以上的操作系统,但是本文以Windows X...

weixin_39918682的博客 1073

新建文件夹 (3).zip_JAVA打印_java实现打印小票

简单的小票打印,可以自定义内容进行展示。使用java print类

Paper‘s imageable width is too small.Java控制标签打印机的错误现象解决

错误现象 : Paper’s imageable width is too small. 解决方案 : int x = 1000; int y = 1000; // 设置打印参数 PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); // 设置纸张大小 , 实际测试没有这个功能, 还是要标签打印机设置 MediaPrintableArea area = new MediaPrintableArea(0, 0, x, y

记录点点滴滴 1182

DeepSeek-R1模型+Dify实战:5步打造能读PDF的智能客服(附BGE-M3嵌入模型配置)

本文详细介绍了如何利用DeepSeek-R1大模型与Dify平台,结合BGE-M3嵌入模型,构建企业级智能文档问答系统。通过5个步骤,从环境准备到知识库构建,再到智能问答应用开发,帮助企业快速从PDF等文档中提取关键信息,提升工作效率。特别适合处理产品手册、内部规程等专业内容。

convnet3designer的博客 720

配电网故障重构/孤岛划分/故障恢复

程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》,采用matlab编程软件实现,依据网络结构和DG供电方式对配电网进行孤岛划分,将含有 DG 的配电网拓扑结构看成一个树,搭建成连通图模型,使得将孤岛的划分变成了求取最小生成树,以网损和开关开断次数作为目标,采用 IEEE33 节点配电网为算例,通过遗传算法寻优计算,从而得到最佳的重构方案。

zhangxd212489的博客 2500

缺陷(Bug)分类与定位

bug等级、分类、定位、模板、生命周期的说明

追光和猿 2892

信号削峰CFR基础知识介绍(一)

接下来,将得到的峰值分成若干段,在每一段中,仅保留该段内所有峰值中幅度最大的峰值。为了减少不必要的带外泄露,削峰后的信号将通过一个低通滤波器,以减少对应于削峰后信号中尖锐拐角的高频信号。首先,它识别出高于由目标PAPR确定的阈值的峰值。在峰值加窗算法中,削峰是通过在峰值区域将原始信号与一个加窗函数相乘来实现的,如下图所示。其中,w(n) 是一种常见的加窗函数,如凯撒窗、高斯窗和汉明窗等,而 p(n) 是一个加权系数。如上图所示,削峰会导致削峰后的信号出现尖锐的拐角,从而引发不必要的带外辐射(ACP增加)。

weixin_49761275的博客 1551

软件测试人员正确分析定位BUG小技巧

软件测试人员测试过程中如何分析定位常见BUG 一、前置知识 1. 熟透系统业务、团队成员情况 2.熟悉使用F12或抓包工具 3.了解HTTP/HTTPS协议,能够区分请求URL、请求头、请求体、入参、响应数据、响应码 4. 具备操作常规Linux命令,能否登入服务器查看Log日志,例如Tomcat等应用,不排除一些公司有对应的查看日志平台,例如K8S、Xlog,总之会查看对应服务打印的日志就行,这里日志等级输出具体可以百度 5. 了解系统的架构,数据走向 6.思维敏捷,懂得检索百度 二...

m0_67419887的博客 5194

TikTok Shop API密钥获取与PHP实战对接指南

本文详细介绍了TikTok Shop API密钥的获取流程与PHP实战对接方法。从开发者后台创建应用、获取核心的API密钥开始,逐步解析OAuth 2.0授权机制,并提供了完整的PHP封装类示例,涵盖签名生成、API调用、令牌刷新及错误处理,帮助开发者快速实现与TikTok Shop的数据对接与自动化操作。

weixin_29300241的博客 403

4、海洋哺乳动物运动能量学:潜水与生存的奥秘

本文深入探讨了海洋哺乳动物在潜水与运动中的能量消耗机制,涵盖其生理反应、代谢成本、节能行为策略及测量方法。通过分析不同物种的能量利用特点,揭示了它们如何在极端水下环境中维持能量平衡,并讨论了该研究在保护生物学、生态系统动态和动物健康管理中的实际意义。文章还展望了未来多学科交叉、长期监测及应对环境变化的研究方向,为理解海洋哺乳动物的生存奥秘提供了系统性视角。

p5l2m9n4o6q的博客 116

JAVA-定位排查bug

在开发过程中难免会遇到bug,理解bug的含义,定位bug的位置,对于解决bug至关重要!掌握高效的排错技巧,对于程序员来说必不可少。

向诸位大佬虚心学习 2743

MAC-H3C官网inode客户端下载安装

MAC-H3C官网inode客户端下载安装

兴趣是最好的老师 1万+

面试必问:如何快速定位BUG?BUG定位技巧及N板斧

在这点上,不得不说,有的开发做的比较好,他会有自己的思想,在开发的时候就能发现需求文档的错误,而有的开发则是无条件无脑执行。经常见到后端开发人员有的负责接口,有的负责写入数据库,有的负责维护缓存,所以如果发现是后端的问题,可以更进一步确认下是哪块的问题。后端生成页面,最常见的就是类似于jsp、php、python的某些前后端不分离的框架,这种比较特殊,常见于单人开发的项目,这种项目的问题排查和其他项目总的思路也一样,只不过前后端bug的修改可能都是同一个人而已。有的开发不够open,会觉得你抢了他的饭碗。

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 5221

Vue3 - 详解实现网站接入钉钉扫码登录功能,钉钉授权生成登录二维码用户用手机扫描二维码登陆,支持弹框式、浏览器单独新开页显示,钉钉扫描二维码登录详细流程及示例代码,最新vue集成钉钉扫码授权登录!

vue3,nuxt3,钉钉,扫码登录,vue3钉钉扫码登陆,钉钉授权第三方WEB网站扫码登录功能,钉钉扫码登录第三方网站,单点登录,二维码不显示,报错,扫了没反应,出错,vue3钉钉扫码登录,内嵌,获取个人信息,pc网页钉钉登录,钉钉扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描钉钉二维码登录网站,页面弹出一个小窗口而不是打开一个页面,vue3中使用iframe实现另开小窗口扫码登

🏆 前端领域优质创作者 3695

19、利用PostGIS进行空间分析:更高效的矢量分析方法

本文介绍了如何利用PostGIS进行高效灵活的矢量空间分析,重点探讨了在选址安静住宅场景中使用缓冲区和距离测量两种方法的实现与优化。通过QGIS与PostGIS结合,演示了数据上传、CTE应用、ST_Intersects与ST_Distance函数对比,并深入分析了横向子查询在提升查询性能和代码可读性方面的优势。文章还比较了不同方法的适用场景,并以房地产开发选址为例展示了完整分析流程,最后总结了PostGIS在空间分析中的强大能力与未来应用前景。

d3e4f的博客 92

如何快速定位bug

我们会遇到很多bug,所有debug的能力就显得尤为重要,而debug的思路往往取决于你debug时候的思路是什么,希望大家在日常debug的时候可以多思考,多总结,bug是无穷无尽的,但是思路是想通的,如果还有什么其他的好的方法,欢迎评论!又有句老话说的好,太少的信息和太多的信息都对我们的判断有影响。3. log日志,那么最常用的,也是最重要的对信息的查看就是日志了,java里常见的日志组件有lombok等,它的功能非常强大,比如log日志文件导出,比如根据不同的等级来显示不同的信息。

sbysgysby的博客 554

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

常见BUG如何在测试过程中分析定位

在测试的日常工作中,相信经常有测试的小伙伴遇到类似的情况:在项目上线时,只要出现问题(bug),就很容易成为“背锅侠”。软件测试人员在工作中是无法避免的要和开发人员和产品经理打交道的,开发人员先将软件程序写出来,然后再由软件测试人员进行测试。一般在测试完成后,软件项目才能生产上线,然而在这个过程中,软件项目难免会出现一些问题(BUG),这个时候测试人员可能有听过类似的一些话:“这么明显的问题(bug)都没有发现测试出来吗?“怎么这个产品的功能还没测试完就上线了?

q—qun1150305204的博客 891

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CPU占用过高,分析定位到哪一行代码存在bug

总的来说就是利用 jstack 命令打印一下堆栈中的信息 而 jstack 需要线程id 因此第一步是先分析一下系统中占用cpu过高的程序是哪一个进程,通过top命令可以查看到 第一步找到cpu占用最高的进程id(定位进程) top 如下输出,找到这个%CPU表示cpu占用率,默认是降序,因此先定位到进程id 也就是PID 找到进程后,我们接着细致的找进程中的哪一个线程占用cpu过高 第二步 定位到是那个java程序 jps -l | grep 进程pid 这行命令的作用是通过jps -l打印进程pi

诗水人间 2690

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

面试必问:如何快速定位BUG?BUG定位技巧及N板斧_java查bug的技巧

包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

2301_82257317的博客 1249

面试必问:如何快速定位BUG?BUG定位技巧及N板斧!

在这点上,不得不说,有的开发做的比较好,他会有自己的思想,在开发的时候就能发现需求文档的错误,而有的开发则是无条件无脑执行。后端生成页面,最常见的就是类似于jsp、php、python的某些前后端不分离的框架,这种比较特殊,常见于单人开发的项目,这种项目的问题排查和其他项目总的思路也一样,只不过前后端bug的修改可能都是同一个人而已。一些小型程序,例如前后端都用node、php语言开发的,整个系统前后端是同一个开发的时候,那么小编可以自信的给你说,系统出现问题时,bug大胆的提,往猝死的提,责任人错不了!

nhb000000的博客 1022

定位Bug技巧总结

http://blog.youkuaiyun.com/sinat_25141403/article/details/51307360 解决Bug是编程人员的天职(创造Bug算是一种天赋吧),甚至有人这么认为:开发人员的能力可以依据他能决解Bug的复杂程度来评定。简单的Bug大多数程序员是靠臆断来解决的,但是当Bug隐藏在代码的最深处,臆断不能够解决问题的时候,或许我们就得依靠些许技巧而不是重启。

BlackhorseMe的专栏 815
上一篇: Eclipse 下 Applet 的路径问题
下一篇: 用Java制作属性编辑器
sendfeng
博客等级 码龄20年 5粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值