JAVA 呼叫印表機輸出PDF檔案
阿新 • • 發佈:2018-12-17
想利用java程式列印一些檔案。做以下測試:
一、環境
要呼叫印表機輸出檔案,首先本地得有一個能正常使用的印表機。我電腦安裝的是虛擬印表機。
二、java程式碼
一)、列印輸出的實體類
import java.io.Serializable; import java.util.Date; /** * @Author: ykbian * @Date: 2018/10/24 9:22 * @Todo: 列印的員工資訊實體類 */ public class Persion implements Serializable { private static final long serialVersionUID = 1L; private String userName; //姓名 private String gender; //性別 private String nation; // 民族 private String address; //住址 private String IDNumber; //身份證號碼 private int age; //啟用日期 private String qrCodePath; //頭像 private Date birthday; // 以下是get方法、set方法和兩個建構函式,省略 }
二)、工具類及測試
/** * @Author: ykbian * @Date: 2018/10/24 9:24 * @Todo: 列印的工具類 */ public class PrintUtil implements Printable { // 身份證:長度85.6毫米,寬度54毫米,厚度0.9毫米 //待列印資料的條數,此變數需定義在資料集合之前 private static int COUNT = 0; //待列印的文字資料 private static List<Persion> STUDENT_LIST = getStudent(); //日期格式 private static SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); /** *@Author: ykbian *@date_time: 2018/10/24 13:41 *@Description: 重寫Printable 的print()方法 *@param: Graphic指明列印的圖形環境 * PageFormat指明列印頁格式(頁面大小以點為計量單位,1點為1英寸的1/72,1英寸為25.4毫米。A4紙大致為595×842點) * pageIndex指明頁號 */ @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { Component c = null; //轉換成Graphics2D Graphics2D g2 = (Graphics2D) graphics; //設定列印顏色為黑色 g2.setColor(Color.BLACK); //列印起點座標 double x = pageFormat.getImageableX(); double y = pageFormat.getImageableY(); switch (pageIndex) { case 0: //設定列印字型(字型名稱、樣式和點大小)(字型名稱可以是物理或者邏輯名稱) //Java平臺所定義的五種字體系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInput Font font = new Font("新宋體", Font.PLAIN, 20); //設定字型 g2.setFont(font); float[] dash1 = {2.0f}; //設定列印線的屬性。 //1.線寬 2、3、不知道,4、空白的寬度,5、虛線的寬度,6、偏移量 g2.setStroke(new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 2.0f, dash1, 0.0f)); //獲取需要列印的圖片,若是動態生成,直接傳入絕對路徑即可 Image src = Toolkit.getDefaultToolkit().getImage(STUDENT_LIST.get(COUNT).getQrCodePath()); System.out.println(STUDENT_LIST.get(COUNT).getQrCodePath()); if (src == null) { System.out.println("沒有找到影象"); } // 圖片的座標(x,y)寬,高 g2.drawImage(src,(int)120,(int)150,(int)136,(int)220,c); //標題,固定不變 g2.drawString(STUDENT_LIST.get(COUNT).getTitle(), (float) 250, (float)100); //以下為動態的文字內容 font = new Font("新宋體", Font.ROMAN_BASELINE, 15); g2.setFont(font); g2.drawString("姓名:" + STUDENT_LIST.get(COUNT).getUserName(), (float) 50, (float) 150); g2.drawString("性別:" + STUDENT_LIST.get(COUNT).getGender(), (float) 50, (float) 170); g2.drawString("民族:" + STUDENT_LIST.get(COUNT).getNation(), (float) 50, (float) 190); g2.drawString("住址:" + STUDENT_LIST.get(COUNT).getAddress(), (float) 50, (float) 210); g2.drawString("路徑:" + STUDENT_LIST.get(COUNT).getQrCodePath(), (float) 50, (float) 230); g2.drawString("身份證號碼:" + STUDENT_LIST.get(COUNT).getIDNumber(), (float) 50, (float) 250); g2.drawString("出生日期:" + FORMAT.format(STUDENT_LIST.get(COUNT).getBirthday()), (float) 50, (float) 280); return PAGE_EXISTS; default: return NO_SUCH_PAGE; } } /** * 封裝測試資料 * * @return */ private static List<Persion> getStudent() { List<Persion> dtos = new ArrayList<>(); dtos.add(new Persion("姜子牙", "男", "漢", "岐山縣", "622222111111111111", 800, "E:\\test\\jzy.jpg", new Date(), "居民身份證")); dtos.add(new Persion("楊戩", "男", "漢", "岐山縣", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份證")); dtos.add(new Persion("哪吒", "男", "漢", "岐山縣", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份證")); dtos.add(new Persion("雷震子", "男", "漢", "岐山縣", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份證")); dtos.add(new Persion("哮天犬", "男", "漢", "岐山縣", "622222111111111111", 800, "E:/test/jzy.jpg", new Date(), "居民身份證")); // if (dtos.size() > 0) { COUNT = dtos.size() - 1; System.out.println("總共需列印" + (COUNT + 1) + "次"); } return dtos; } public static void main(String[] args) { // 通俗理解就是書、文件 Book book = new Book(); // 設定成豎打() PageFormat pf = new PageFormat(); pf.setOrientation(PageFormat.PORTRAIT); // 通過Paper設定頁面的空白邊距和可列印區域。必須與實際列印紙張大小相符。 Paper p = new Paper(); //紙張大小 p.setSize(1000, 618); // 頁面可列印的區域大小(左上角定位,引數分別是x軸,y軸,寬度和長度) p.setImageableArea(15, 15, 800, 600); pf.setPaper(p); // 把 PageFormat 和 Printable 新增到書中,組成一個頁面 book.append(new PrintUtil(), pf); //獲取列印服務物件 PrinterJob job = PrinterJob.getPrinterJob(); // 設定列印類 job.setPageable(book); try { if (STUDENT_LIST.size() > 0) { for (int i = 0; i < STUDENT_LIST.size(); i++) { job.print(); --COUNT; } } } catch (PrinterException e) { e.printStackTrace(); } } }
三、輸出結果
執行程式,輸出結果如下:
然而,還是存在一些問題,圖片列印失敗。不知道為什麼… …
四、原始碼
五、鳴謝
參考文章: