python调用打印机打印文件,图片,pdf等
引言
python连接打印机进行打印,可能根据需求的不同,使用不同的函数模块。
- 如果你只是简单的想打印文档,比如office文档,你可以使用
ShellExecute方法,对于微软office的文档、pdf、txt等有用,你可以尝试下; - 如果你输入某些数据,文字信息,就想直接把它发送给打印机打印,那么可以尝试使用win32print;
- 如果你有一张图片,那么你可以结合python的
Python Imaging Library(PIL)和win32ui模块进行打印;
普通打印
ShellExecute
- 首先确保你电脑中的应用可以打开你要打印的文件;
- 是一些标准的文件类型
- 不用管哪些打印机,也就是说和连接的打印机型号无关;
- 你无控制设置打印属性的权限;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import tempfileimport win32apiimport win32printfilename = tempfile.mktemp (".txt")open (filename, "w").write ("This is a test")win32api.ShellExecute ( 0, "print", filename, # # If this is None, the default printer will # be used anyway. # '/d:"%s"' % win32print.GetDefaultPrinter (), ".", 0) |
另一个版本
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import tempfileimport win32apiimport win32printfilename = tempfile.mktemp (".txt")open (filename, "w").write ("This is a test")win32api.ShellExecute ( 0, "printto", filename, '"%s"' % win32print.GetDefaultPrinter (), ".", 0) |
直接打印数据
win32print
- 直接将数据扔给打印机;
- 快速而且容易;
- 而且可以定义选择哪个打印机打印;
- 但是要打印的数据必须是可打印的,例如字符串等;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import os, sysimport win32printprinter_name = win32print.GetDefaultPrinter ()## raw_data could equally be raw PCL/PS read from# some print-to-file operation#if sys.version_info >= (3,): raw_data = bytes ("This is a test", "utf-8")else: raw_data = "This is a test"hPrinter = win32print.OpenPrinter (printer_name)try: hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW")) try: win32print.StartPagePrinter (hPrinter) win32print.WritePrinter (hPrinter, raw_data) win32print.EndPagePrinter (hPrinter) finally: win32print.EndDocPrinter (hPrinter)finally: win32print.ClosePrinter (hPrinter) |
打印图片

PIL win32ui
不使用额外的工具,在windows电脑上打印一张图片是相当的困难,至少需要3种不同的且相关的设备环境才可以。
还好,device-independent bitmap(DIB)和PIL可以帮助我们快速打印。下面的代码可以将图片发送至打印机打印尽可能大的尺寸且不失比例。
- 还可以选择使用哪个打印机
- 选择加载的图片的格式等
- 但是如果你电脑不是windows,那可能不是最好的方法;
|
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
|
import win32printimport win32uifrom PIL import Image, ImageWin## Constants for GetDeviceCaps### HORZRES / VERTRES = printable area#HORZRES = 8VERTRES = 10## LOGPIXELS = dots per inch#LOGPIXELSX = 88LOGPIXELSY = 90## PHYSICALWIDTH/HEIGHT = total area#PHYSICALWIDTH = 110PHYSICALHEIGHT = 111## PHYSICALOFFSETX/Y = left / top margin#PHYSICALOFFSETX = 112PHYSICALOFFSETY = 113printer_name = win32print.GetDefaultPrinter ()file_name = "test.jpg"## You can only write a Device-independent bitmap# directly to a Windows device context; therefore# we need (for ease) to use the Python Imaging# Library to manipulate the image.## Create a device context from a named printer# and assess the printable size of the paper.#hDC = win32ui.CreateDC ()hDC.CreatePrinterDC (printer_name)printable_area = hDC.GetDeviceCaps (HORZRES), hDC.GetDeviceCaps (VERTRES)printer_size = hDC.GetDeviceCaps (PHYSICALWIDTH), hDC.GetDeviceCaps (PHYSICALHEIGHT)printer_margins = hDC.GetDeviceCaps (PHYSICALOFFSETX), hDC.GetDeviceCaps (PHYSICALOFFSETY)## Open the image, rotate it if it's wider than# it is high, and work out how much to multiply# each pixel by to get it as big as possible on# the page without distorting.#bmp = Image.open (file_name)if bmp.size[0] > bmp.size[1]: bmp = bmp.rotate (90)ratios = [1.0 * printable_area[0] / bmp.size[0], 1.0 * printable_area[1] / bmp.size[1]]scale = min (ratios)## Start the print job, and draw the bitmap to# the printer device at the scaled size.#hDC.StartDoc (file_name)hDC.StartPage ()dib = ImageWin.Dib (bmp)scaled_width, scaled_height = [int (scale * i) for i in bmp.size]x1 = int ((printer_size[0] - scaled_width) / 2)y1 = int ((printer_size[1] - scaled_height) / 2)x2 = x1 + scaled_widthy2 = y1 + scaled_heightdib.draw (hDC.GetHandleOutput (), (x1, y1, x2, y2))hDC.EndPage ()hDC.EndDoc ()hDC.DeleteDC () |
实践
从前台传来要打印的字符,后端生成二维码,并作出相应处理后,连接打印机打印图片。
|
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
|
# 打印二维码def print_barcode(request): import pyqrcode import random,string from PIL import Image,ImageDraw,ImageFont import numpy as np if request.is_ajax() and request.method == 'POST': result = {} bar_string = 'NaN' type = request.POST['type'] if type == 'box': # 生成箱子码 # 格式:P190823-K91 [P][日期][-][A-Z][0-9][0-9] bar_string = 'P'+datetime.date.today().strftime('%y%m%d')+'-'+str(random.choice('ABCDEFGHIGKLMNOPQRSTUVWXYZ'))\ + str(random.choice(range(10)))+ str(random.choice(range(10))) elif type == 'kuwei': # 生成库位码 bar_string = request.POST['string'] else: pass try: big_code = pyqrcode.create(bar_string, error='L', version=2 , mode='binary') big_code.png('./code.png', scale=8) img_code = Image.open('code.png') size = img_code.size img_final = Image.new('RGB', (size[0], size[1]+35), color=(255, 255, 255)) img_final.paste(img_code, (0, 0, size[0], size[1])) draw = ImageDraw.Draw(img_final) font = ImageFont.truetype('AdobeGothicStd-Bold.otf', size=35) width, height = draw.textsize(bar_string,font=font) draw.text(((size[0]-width)/2, size[1]-15), bar_string , fill=(0, 0, 0), font=font) img_final.save('./code.png') # 然后连接打印机将其打印出来即可 is_ok =[] if type == 'box': for i in range(4): temp = print_img('./code.png') is_ok.append(temp) else: temp = print_img('./code.png') is_ok.append(temp) # is_ok = True result['done'] = 'ok' if np.all(is_ok) else '连接打印机失败' except Exception as e: result['done'] = e return JsonResponse(result) def print_img(img): import win32print import win32ui from PIL import Image, ImageWin # 参考 http://timgolden.me.uk/python/win32_how_do_i/print.html#win32print try: printer_name = win32print.GetDefaultPrinter() hDC = win32ui.CreateDC() hDC.CreatePrinterDC(printer_name) #printable_area = (300, 270) # 打印纸尺寸 #printer_size = (300, 270) # 打开图片并缩放 bmp = Image.open(img) if bmp.size[0] < bmp.size[1]: bmp = bmp.rotate(90) # ratios = [1.0 * printable_area[0] / bmp.size[1], 1.0 * printable_area[1] / bmp.size[0]] # scale = min(ratios) scale = 1 hDC.StartDoc(img) hDC.StartPage() dib = ImageWin.Dib(bmp) scaled_width, scaled_height = [int(scale * i) for i in bmp.size] x1 = 20 # 控制位置 y1 = -30 x2 = x1 + scaled_width y2 = y1 + scaled_height dib.draw(hDC.GetHandleOutput(), (x1, y1, x2, y2)) hDC.EndPage() hDC.EndDoc() hDC.DeleteDC() return True except: return False |
打印效果:

仅供学习使用
python调用打印机打印文件,图片,pdf等的更多相关文章
- C# 调用打印机打印文件
C# 调用打印机打印文件,通常情况下,例如Word.Excel.PDF等可以使用一些对应的组件进行打印,另一个通用的方式是直接启用一个打印的进程进行打印.示例代码如下: using System.Di ...
- Java jacob调用打印机打印word文档
前面说了Java如何生成复杂的Word文档,今年记录下Java如何调用打印机打印word文档. 起初用的是自带的PrintJob,但是系统提供的打印机制并不成熟完整.网上的代码也是千篇一律,在我的打印 ...
- 办公利器!用Python快速将任意文件转为PDF
痛点: 相信大家都会遇到一种场景.老师/上司要求你把某个文件转为pdf,并且是一批(不止一个,一个的话手动就可以搞定),并且这种是枯燥无聊的工作,既没有什么技术含量又累. 试想一下,如果我把这些文件放 ...
- aspose调用打印机打印文档
aspose很不错的插件,功能非常强大,用到了其中的aspose.word. 如何生成word文档,点击. 下面说说如何如何通过打印机打印文档. aspose提供了一个print方法,通过该方法可以直 ...
- python调用另一个文件中的代码,pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
如何调用另一个python文件中的代码无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等, ...
- 打印信息,通过.jasper工具将集合输出到PDF文件 然后利用打印机打印文件
我们上一次成功的利用iReport工具制作了一张报表,并且预览了报表最后的效果,也生成了格式为“jrpxml”.“jrxml”与“jasper”的文件.这次,我们使用jasper提供的java的api ...
- Java调用打印机打印指定路径图片
依赖 javax.print package com.xgt.util; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; ...
- Java调用PDFBox打印自定义纸张PDF
打印对象 一份设置为A3纸张, 页面边距为(10, 10, 10, 10)mm的PDF文件. PageFormat 默认PDFPrintable无法设置页面大小. PDFPrintable print ...
- C# 调用打印机 打印 Excel
打印 Excel 模板 大体思路,通过NPOI操作Excel文件,通过Spire将Excel转成图片,将图片传给系统打印. Spire是收费工具,在微软库中下载Free版本. #region 打印所用 ...
- Python调用打印机参考例子
参考资料: http://blog.csdn.net/jdh99/article/details/42585987 http://www.oschina.net/question/1438043_23 ...
随机推荐
- hbuliter x 连接雷电模拟器
adb 路径 E:\HBuilderX\plugins\launcher\tools\adbs 也可以配置环境变量 配置环境变量:将adb.exe所在路径,放在Path中计算机(右键)→属性→高级系 ...
- 2022竞赛新方法学习1--学习Proceedings of SAT Competition 2022 : Solver and Benchmark Descriptions
Proceedings of SAT Competition 2022 : Solver and Benchmark Descriptions https://helda.helsinki.fi/ha ...
- Logtxt
public static void SSOAuthenLog(string msg, bool isRemoteAuthen = true) { #region ...
- Day1.无敌难受且成功
Markdown学习 标题 字体 ctrl+b.l.u.k加粗.斜体.下划线.超链接 引用 大于号+空格 分割线 三个*** ###都 图片 !+[]+() 英文输入法的符号 输入的图片路径可本地也要 ...
- IDEA Maven 项目报错 java: 程序包org.springframework.beans.factory.annotation不存在
idea 刚把项目导进去的时候,点击运行,import的好多包都报红,所有的文件的Maven依赖包都没导入进去. 但只是第一个报错是: java: 程序包org.springframework.bea ...
- JQUERY选择器大全(转载)
在Web应用程序中,大部分的客户端操作都是基于对象的操作,要操作对象就必须先获取对象,jQuery提供了强大的选择器让我们获取对象.我人为地将jQuery选择器分为两大部分:选择对象和筛选条件.选择对 ...
- 帝国CMS 登录后跳转ecmsadmin.php 白页 多个解决方案
帝国CMS 6.6 版本, 运维的网站查询除了问题, 把网站数据库和整体网站拷贝到本地服务器, 配置好 e/config/config.php 和 e/class/config.php 两个目录 ...
- 【帆吖】Java学习零基础17
Java方法 1 package method; 2 3 public class Demo1 { 4 //main方法 5 public static void main(String[] args ...
- ssh双击互信
默认公钥文件/root/.ssh/id_rsa.pub默认私钥文件/root/.ssh/id_rsa 只有将公钥文件文件拷到其他的服务器上才能登录别的服务器. 服务器A 192.168.1.133 ...
- mitmproxy截取流量和抓包
mitmproxy介绍https://blog.csdn.net/enemy_sprites/article/details/104052506 mitmproxy处理请求及乱码https://blo ...