java实现打印功能

https://www.jianshu.com/p/be0456f5265d


PageFormat pf = new PageFormat();
pf.setOrientation(PageFormat.PORTRAIT);
Paper p = new Paper();
Y = 90.00 + (list.size() * 35);
p.setSize(140.00, Y);
System.out.println("print paper Height : " + p.getHeight());
p.setImageableArea(0, 10, 140, Y);
pf.setPaper(p);
 

Java code

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

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

package com.neusoft.print;

 

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.geom.Area;

import java.awt.print.Book;

import java.awt.print.PageFormat;

import java.awt.print.Paper;

import java.awt.print.Printable;

import java.awt.print.PrinterException;

import java.awt.print.PrinterJob;

import java.util.ArrayList;

import java.util.Date;

import javax.print.PrintService;

import javax.print.PrintServiceLookup;

 

public class StartPrintCheckOut implements Printable {

 

    public int PAGES;

    public String printStr = "";

    public Area area;

    ArrayList rslist;

    public int printFlag = 0;

    private double Y = 0.0;

 

    /*

     * 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) {

        System.out.println(pf.getPaper().getHeight() + "   "

                + pf.getPaper().getWidth());

        ArrayList list = getDrawText(rslist)[page];// 获取当前页的待打印文本内容

        CheckOutVo vo = (CheckOutVo) list.get(0);

        // 获取默认字体及相应的尺寸

 

        Font f = new Font("新宋体", Font.PLAIN, 15);

        g2.setFont(f);

        System.out.println("Y=" + Y);

        g2.drawString("桌位号:" + vo.getTableid(), 25, 20);

        g2.drawLine(0, 25, 135, 25);

        System.out.println("打印区域:" + ((int) Y - 20));

        Font f1 = new Font("新宋体", Font.PLAIN, 13);

        g2.setFont(f1);

        int height = 50;

        float sum = 0.0f;

 

        System.out.println("list_size=" + list.size());

        Font f4 = new Font("新宋体", Font.PLAIN, 10);

        g2.setFont(f4);

        g2.drawString("名称", 5, height - 13);

        g2.drawString("单价", 40, height - 13);

        g2.drawString("数量", 70, height - 13);

        g2.drawString("金额", 100, height - 13);

        g2.drawLine(0, 40, 135, 40);

        height+=10;

         

        Font f2 = new Font("黑体", Font.PLAIN, 8);

        g2.setFont(f2);

        for (int j = 0; j < list.size(); j++) {

            CheckOutVo vo1 = (CheckOutVo) list.get(j);

            g2.drawString(vo1.getMenu_name() + "", 2, height - 5);

            height += 5;

            g2.drawString(vo1.getPrice() + "", 42, height - 1);

            g2.drawString(vo1.getAmount() + "", 72, height - 1);

            g2.drawString(vo1.getPrice_sum() + "", 102, height - 1);

            height += 15;

            System.out.println("height=" + height);

            sum += vo1.getPrice_sum();

        }

 

        height += 15;

        g2.drawString(new java.text.SimpleDateFormat("yyyy-MM-dd")

                .format(new Date()), 5, height - 5);

        g2.drawString("总金额:" + sum, 66, height - 5);

        height += 35;

        g2.drawString("" + ".", 68, height - 5);

        //g2.drawLine((int)(90.00 + (list.size() * 35)), 35, 135, 35);

        //Y+=20;

        System.out.println("最后打印的高度 height : " + height);

    }

 

    /* 将打印目标文本按页存放为字符串数组 */

    public ArrayList[] getDrawText(ArrayList list) {

        ArrayList[] mtlist = new ArrayList[PAGES];// 根据页数初始化数组

        mtlist[0] = list;

        return mtlist;

    }

 

    public void printText2Action(ArrayList list, StartPrintCheckOut sp) {

        printFlag = 0// 打印标志清零

 

        if (list.size() > 0// 当打印内容不为空时

        {

            this.rslist = list;

            System.out.println("开始打印..............");

            System.out.println("本次打印数为:" + list.size());

 

            PAGES = 1// 获取打印总页数

            // 通俗理解就是书、文档

            Book book = new Book();

            // 设置成竖打

            PageFormat pf = new PageFormat();

            pf.setOrientation(PageFormat.PORTRAIT);

            // 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。

            Paper p = new Paper();

             

            Y = 90.00 + (list.size() * 35);

            p.setSize(140.00, Y);// 纸张大小

            System.out.println("print paper Height : " + p.getHeight());

            p.setImageableArea(010140, Y);// A4(595 X

                                                // 842)设置打印区域,其实0,0应该是72,72,因为A4纸的默认X,Y边距是72

            pf.setPaper(p);

            // 把 PageFormat 和 Printable 添加到书中,组成一个页面

            book.append(sp, pf, PAGES);

 

            CheckOutVo vo = (CheckOutVo) rslist.get(0);

 

            int printid = vo.getIsprintall();

            PrintService[] services = PrintServiceLookup.lookupPrintServices(

                    nullnull);

 

            CheckOutDao dao = new CheckOutDao();

            String printname = dao.selectprintname(printid);

            PrintService services1 = null;

            System.out.println("length:=" + services.length);

            for (int i = 0; i < services.length; i++) {

                System.out.println("name=" + services[i].getName());

                if (printname.equals(services[i].getName())) {

                    services1 = services[i];

                    System.out.println("正在运行的打印机名称:" + printname);

                }

            }

 

            // 获取打印服务对象

            PrinterJob job = PrinterJob.getPrinterJob();

 

            // 设置打印类

 

            job.setPageable(book);

            System.out.println("print pf.getHeight() : " + pf.getHeight());

             

 

            try {

                System.out.println("service:" + services1);

                job.setPrintService(services1);

            catch (PrinterException e1) {

                // TODO Auto-generated catch block

                e1.printStackTrace();

            }

 

            try {

                // 可以用printDialog显示打印对话框,在用户确认后打印;也可以直接打印

 

                job.print();

 

            catch (PrinterException e) {

                e.printStackTrace();

            }

        else {

            // 如果打印内容为空时,提示用户打印将取消

            // JOptionPane.showConfirmDialog(null,

            // "Sorry, Printer Job is Empty, Print Cancelled!",

            // "Empty", JOptionPane.DEFAULT_OPTION,

            // JOptionPane.WARNING_MESSAGE);

            // System.out.println("打印内容为空!");

        }

 

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值