1. 程式人生 > >java實現呼叫印表機

java實現呼叫印表機

前言

在我們的實際工作中,經常需要實現列印功能。但由於歷史原因,Java 提供的列印功能一直都比較弱。實際上最初的 jdk 根本不支援列印,直到 jdk1.1 才引入了很輕量的列印支援。所以,在以前用 Java/Applet/JSP/Servlet 設計的程式中,較複雜的列印都是通過呼叫 ActiveX/OCX 控制元件或者 VB/VC 程式來實現的,非常麻煩。實際上,SUN 公司也一直致力於 Java 列印功能的完善,而 Java2 平臺則終於有了一個健壯的列印模式的開端,該列印模式與 Java2D 圖形包充分結合成一體。更令人鼓舞的是,新發布的 jdk1.4 則提供了一套完整的"Java 列印服務 API" (Java Print Service API),它對已有的列印功能是積極的補充。利用它,我們可以實現大部分實際應用需求,包括列印文字、圖形、檔案及列印預覽等等。本文將通過一個具體的程式例項來說明如何設計 Java 列印程式以實現這些功能,並對不同版本的實現方法進行分析比較。希望大家能從中獲取一些有益的提示。

Java 中的列印

2.1 Java 的列印 API

Java 的列印 API 主要存在於 java.awt.print 包中。而 jdk1.4 新增的類則主要存在於 javax.print 包及其相應的子包 javax.print.event 和 javax.print.attribute 中。其中 javax.print 包中主要包含列印服務的相關類,而 javax.print.event 則包含列印事件的相關定義,javax.print.attribute 則包括列印服務的可用屬性列表等。

2.2 如何實現列印

要產生一個列印,至少需要考慮兩條:

  1. 需要一個列印服務物件。這可通過三種方式實現:在 jdk1.4 之前的版本,必須要實現 java.awt.print.Printable 介面或通過 Toolkit.getDefaultToolkit().getPrintJob 來獲取列印服務物件;在 jdk1.4 中則還可以通過 javax.print.PrintSerivceLookup 來查詢定位一個列印服務物件。
  2. 需要開始一個列印工作。這也有幾種實現方法:在 jdk1.4 之前可以通過 java.awt.print.PrintJob(jdk1.1 提供的,現在已經很少用了)呼叫 print 或 printAll 方法開始列印工作;也可以通過 java.awt.print.PrinterJob 的 printDialog 顯示列印對話方塊,然後通過 print 方法開始列印;在 jdk1.4 中則可以通過 javax.print.ServiceUI 的 printDialog 顯示列印對話方塊,然後呼叫 print 方法開始一個列印工作。

2.3 印表機對話方塊

2.3.1 Printable 的列印對話方塊

開始列印工作之前,可以通過 PrinterJob.printDialog 來顯示一個列印對話方塊。它給使用者一個機會以選擇應該列印的頁碼範圍,並可供使用者改變列印設定。它是一個本地對話方塊。

事實上,當從一個 Printable 物件進行一個列印工作時,列印物件並不知道需要列印多少頁。它只是不停地呼叫 print 方法。只要 print 方法返回 Printable.PAGE_EXISTS 值,列印工作就不停地產生列印頁,直到 print 方法返回 Printable.NO_SUCH_PAGE 時,列印工作才停止。

由於列印工作只有在列印完成後才進行準確的頁數計算,所以在對話方塊上的頁碼範圍是尚未初始化的 [1,9999]。我們可以通過構建一個 java.awt.print.Book 物件傳遞給列印物件;也可以通過指定的格式計算需要列印的頁數並傳遞給列印物件,使其準確地知道要列印多少頁。

2.3.2 ServiceUI 的列印對話方塊

與 Printable 的對話方塊不同的是,在 jdk1.4 提供 ServiceUI 的印表機對話方塊的預設行為已經用新的 API 更改了:預設情況下對話方塊不顯示。我們必須使用 ServiceUI 類呼叫 printDialog 方法建立如下所示的列印對話方塊。

Java 列印程式設計例項

3.1 列印文字

3.1.1 應用場景

假設我們需要列印一個窗體的某個文字編輯域(可能只有幾行,也可能包含多頁)的內容,並且每頁最多列印 54 行,如何實現呢?

3.1.2 解決方法

基本思路如下:首先我們需要實現 Printable 介面,然後按照每頁最多 54 行的格式計算共需要列印多少頁,當列印文字的按鈕被點選時,執行相應的列印動作。列印文字的具體操作可通過 Graphics2D 的 drawString 方法來實現。

1、實現 Printable 介面


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

/*Graphic 指明列印的圖形環境;PageFormat 指明列印頁格式(頁面大小以點為計量單位,
1 點為 1 英才的 1/72,1 英寸為 25.4 毫米。A4 紙大致為 595 × 842 點);page 指明頁號 */
public int print(Graphics g, PageFormat pf, int page) throws PrinterException
{
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.black); // 設定列印顏色為黑色
if (page >= PAGES) // 當列印頁號大於需要列印的總頁數時,列印工作結束
return Printable.NO_SUCH_PAGE;
g2.translate(pf.getImageableX(), pf.getImageableY());// 轉換座標,確定列印邊界
drawCurrentPageText(g2, pf, page); // 列印當前頁文字
return Printable.PAGE_EXISTS; // 存在列印頁時,繼續列印工作
}
/* 列印指定頁號的具體文字內容 */
private void drawCurrentPageText(Graphics2D g2, PageFormat pf, int page)
{
String s = getDrawText(printStr)[page];// 獲取當前頁的待列印文字內容
// 獲取預設字型及相應的尺寸
FontRenderContext context = g2.getFontRenderContext();
Font f = area.getFont();
String drawText;
float ascent = 16;   // 給定字元點陣
int k, i = f.getSize(), lines = 0;
while(s.length() > 0 && lines < 54) // 每頁限定在 54 行以內
{
k
= s.indexOf('\n'); // 獲取每一個回車符的位置
if (k != -1)  // 存在回車符
{
lines += 1; // 計算行數
drawText
= s.substring(0, k); // 獲取每一行文字
g2.drawString(drawText, 0, ascent); // 具體列印每一行文字,同時走紙移位
if (s.substring(k + 1).length() > 0)
{
s = s.substring(k + 1); // 擷取尚未列印的文字
ascent += i;
}
}
else // 不存在回車符
{
lines += 1; // 計算行數
drawText = s; // 獲取每一行文字
g2.drawString(drawText, 0, ascent); // 具體列印每一行文字,同時走紙移位
s = ""; // 文字已結束
}
}
}
/* 將列印目標文字按頁存放為字串陣列 */
public String[] getDrawText(String s)
{
String[] drawText = new String[PAGES];// 根據頁數初始化陣列
for (int i = 0; i < PAGES; i++)
drawText[i] = ""; // 陣列元素初始化為空字串

相關推薦

java實現呼叫印表機

前言在我們的實際工作中,經常需要實現列印功能。但由於歷史原因,Java 提供的列印功能一直都比較弱。實際上最初的 jdk 根本不支援列印,直到 jdk1.1 才引入了很輕量的列印支援。所以,在以前用 Java/Applet/JSP/Servlet 設計的程式中,較複雜的列印都

opencv java實現呼叫攝像頭動態識別人臉

前言 實現這個之前使用純C研究實現過,並用C++重構過一遍,因API改動有點多所以也參考過網上一些其它人的java實現,然而很多幾乎用不了,但java的面向物件思想實現的東西卻讓我找到了C++重構時遇到找不到API的困境,所以此章只會放出java部分程式碼(能夠執行的並實現如標題的功能),如有興趣的可以參考

C#實現呼叫印表機(列印字串、列印繪圖、列印圖片),還差列印水晶報表

C#實現呼叫印表機(列印字串、列印繪圖、列印圖片),還差列印水晶報表 目的:呼叫印表機的使用 缺陷:列印的物件不全(還差列印水晶報表),不能實現在外掛繪圖板中畫什麼列印什麼 改進:同缺陷,希望朋友們能提供解決方案,和提供改進方案,請留言謝謝。 C# winfrom 介面(純功能測

JAVA實現呼叫微信js-sdk掃一掃

喜歡的朋友可以關注下。 已經很久沒有給大家分享一片技術文章了,今天抽了點時間來,給大家說一說如何呼叫微信提供的掃一掃介面。 前提: 需要申請一個公眾號:申請公眾號需要的資料我就不說了,去申請微信會提示需要哪些。 準備appid(公眾號的id) AppSecret (

利用Axis2開發WebService(3)---用Java實現呼叫WebService的客戶端程式

WebService是為程式服務的,只在瀏覽器中訪問WebService是沒有意義的。因此,在本節使用Java實現了一個控制檯程式來呼叫上一節釋出的WebService。呼叫WebService的客戶端程式碼如下: package client; impor

有關於用java呼叫印表機進行列印時的設定問題

眾所周知,用java可以呼叫印表機來進行列印。但是本人在使用的過程中遇到了很多的問題,有的其實很簡單,但卻當時並不知道該怎麼做,無從下手,最後在偶然的機會解決了問題。在此希望能夠幫助大家。 在使用印表機服務時,很多人在設定紙張上所苦惱。比如,我想列印憑證單據,這種單據是HA

java實現二維碼生成及呼叫印表機列印

在開發二維碼列印的過程中走過幾次彎路,所以在這裡特意將其記錄下來留作備忘。一開始參考其他博主寫的文章,有介紹通過編寫JAVA後臺程式碼來獲取本地預設印表機的驅動實現列印。BUT!這樣就導致在本地開發測試時看似一切正常,一旦專案部署到linux環境下,就會完全失效了(JAVA後臺程式碼去獲取linux本地的印表

Java實現是否為節假日、工作日判斷(呼叫“http://api.goseek.cn/Tools/holiday”介面)

工具類: package com.ai.rai.group.system; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import org.apache.common

java實現非同步呼叫例項

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JAVA實現簡訊介面的呼叫

前言    基本上在所有的APP或者網站上註冊使用者時大家都可以通過手機號進行註冊,這是一個專案必備的功能之一,但是怎麼實現的呢?通過接通簡訊介面,這一點大家想必都明白,接下來大家來看下具體操作,如有不對,請輕噴 第一步、找個簡訊批發商註冊個賬號, 筆者這裡選用的是榮

java客戶端呼叫印表機

這種方式的問題就是 你的專案如果打包部署到雲服務上面  那就直接gg了 樓主的問題環境是:pdf內容已經在後臺用itextpdf已經畫好了,所以我想要達到的目的僅僅就是在瀏覽器端呼叫印表機直接列印就好了 在這中間嘗試了一些js外掛 但是都需要在頁面重新畫,但是我已經在

Java Web呼叫Matlab實現線上繪圖

具體操作步驟如下: 一、利用Matlab編譯jar包 (一)軟體準備: 1、本機安裝Matlab2014b win64 2、JDK1.7。據網上文章說,1.8還沒有被Matlab2014b支援,但是沒有試過。 (二)步驟: 1、編寫matlab繪圖函式 比如

JAVA 呼叫印表機輸出PDF檔案

想利用java程式列印一些檔案。做以下測試: 一、環境 要呼叫印表機輸出檔案,首先本地得有一個能正常使用的印表機。我電腦安裝的是虛擬印表機。 二、java程式碼 一)、列印輸出的實體類 import java.io.Serializable; import ja

Java:使用Java呼叫印表機進行列印

一、Java的列印簡介 在我們的實際工作中,經常需要實現列印功能。但由於歷史原因,Java 提供的列印功能一直都比較弱。實際上最初的 jdk 根本不支援列印,直到 jdk1.1 才引入了很輕量的列印支援。實際上,SUN 公司也一直致力於 Java 列印功能的完善,而 Jav

java後臺呼叫簡訊介面,實現傳送簡訊驗證碼的控制層實現

1.設計:使用者填寫手機號,點選獲取驗證碼按鈕,controller層獲得所要傳送驗證碼的手機號,隨機生成六位數的驗證碼。呼叫傳送簡訊介面url向此手機號傳送驗證碼。注意:下面的程式碼採用的是雲信使的簡訊驗證碼介面,不同的驗證碼更換不同的url格式,即可。 `

Java實現Web Api介面遠端呼叫

package com.watering.as.web.utils; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.

java 實現WebService介面呼叫

/** * 使用者角色查詢對外介面 * @param accountid 當前使用者工號 * @param type 查詢型別 type=1 查詢使用者在CMS的角色 * @param branchName 分支名稱 type為 2 時 必填,其它

java實現百度統計api呼叫

**公司需要呼叫百度統計的api,昨天搞了一天,先看了百度統計的官方文件 emmmmmmm 是真的沒怎麼看懂,然後在網上搜了各位大牛的實現,最後自己嘗試了一下訪問成功!** 首先是訪問https的類(網上找大牛copy的): 類名 HttpsU

Java 實現傳送驗證碼並呼叫介面驗證 (網易雲信)

大概流程: 使用者輸入賬號點選獲取驗證碼,驗證是否繫結手機號碼,繫結則傳送驗證碼 使用者輸入驗證碼,呼叫介面驗證是否正確返回響應 首先我們需要在網易雲信註冊賬號,獲取得到App Key和App Secret 需要注意的幾個引數:     &nb

通過呼叫API獲取zabbix監控服務(JAVA實現)案例

        因為專案保密的原因,實際程式碼無法貼出,但與他人部落格中的程式碼有一定的相似度,現拷貝部分作為參考,再結合我專欄中的技術文件,以便理解對zabbix的部分封裝過程。  Zabbix4jSampleGetHost.java package com.z