python连接打印机实现打印文档、图片、pdf文件等功能

引言

python连接打印机进行打印,可能根据需求的不同,使用不同的函数模块。

  1. 如果你只是简单的想打印文档,比如office文档,你可以使用ShellExecute方法,对于微软office的文档、pdf、txt等有用,你可以尝试下;
  2. 如果你输入某些数据,文字信息,就想直接把它发送给打印机打印,那么可以尝试使用win32print;
  3. 如果你有一张图片,那么你可以结合python的Python Imaging Library(PIL)win32ui模块进行打印;

普通打印

ShellExecute

  • 首先确保你电脑中的应用可以打开你要打印的文件;
  • 是一些标准的文件类型
  • 不用管哪些打印机,也就是说和连接的打印机型号无关;
  • 你无控制设置打印属性的权限;
import tempfile
import win32api
import win32print

filename = 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
)

另一个版本

import tempfile
import win32api
import win32print

filename = tempfile.mktemp (".txt")
open (filename, "w").write ("This is a test")
win32api.ShellExecute (
 0,
 "printto",
 filename,
 '"%s"' % win32print.GetDefaultPrinter (),
 ".",
 0
)

直接打印数据

win32print

  • 直接将数据扔给打印机;
  • 快速而且容易;
  • 而且可以定义选择哪个打印机打印;
  • 但是要打印的数据必须是可打印的,例如字符串等;
import os, sys
import win32print
printer_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,那可能不是最好的方法;
import win32print
import win32ui
from PIL import Image, ImageWin

#
# Constants for GetDeviceCaps
#
#
# HORZRES / VERTRES = printable area
#
HORZRES = 8
VERTRES = 10
#
# LOGPIXELS = dots per inch
#
LOGPIXELSX = 88
LOGPIXELSY = 90
#
# PHYSICALWIDTH/HEIGHT = total area
#
PHYSICALWIDTH = 110
PHYSICALHEIGHT = 111
#
# PHYSICALOFFSETX/Y = left / top margin
#
PHYSICALOFFSETX = 112
PHYSICALOFFSETY = 113

printer_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_width
y2 = y1 + scaled_height
dib.draw (hDC.GetHandleOutput (), (x1, y1, x2, y2))

hDC.EndPage ()
hDC.EndDoc ()
hDC.DeleteDC ()

实践

从前台传来要打印的字符,后端生成二维码,并作出相应处理后,连接打印机打印图片。

# 打印二维码
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

打印效果:

以上内容为二赛君整理发布,转载请注明出处,谢谢。

参考

http://timgolden.me.uk/python/win32_how_do_i/print.htm

(0)

相关推荐

  • Python调用Windows命令打印文件

    1.Python调用Windows命令打印文件 Windows命令行打印文件使用print 命令,具体用法可使用help print查看.下面是使用Python调用print指令执行打印文件功能的代码: import os def printer(filename): printername = r"/D:\\A340\hpLaser" cmd = "print " + printername + " " + filename print &qu

  • python连接打印机实现打印文档、图片、pdf文件等功能

    引言 python连接打印机进行打印,可能根据需求的不同,使用不同的函数模块. 如果你只是简单的想打印文档,比如office文档,你可以使用ShellExecute方法,对于微软office的文档.pdf.txt等有用,你可以尝试下: 如果你输入某些数据,文字信息,就想直接把它发送给打印机打印,那么可以尝试使用win32print: 如果你有一张图片,那么你可以结合python的Python Imaging Library(PIL)和win32ui模块进行打印: 普通打印 ShellExecut

  • python实现word 2007文档转换为pdf文件

    在开发过程中,会遇到在命令行下将DOC文档(或者是其他Office文档)转换为PDF的要求.比如在项目中如果手册是DOC格式的,在项目发布时希望将其转换为PDF格式,并且保留DOC中的书签,链接等.将该过程整合到构建过程中就要求命令行下进行转换. Michael Suodenjoki展示了使用Office的COM接口进行命令行下的转换.但其导出的PDF文档没有书签.在Office 2007 SP2中,微软加入了该功能,对应的接口是ExportAsFixedFormat.该方法不仅适用于Word,

  • Python实现自动化处理Word文档的方法详解

    目录 1. 批量生成Word文档 2. 将Word文档批量转换成PDF 3. 在Word文档中批量标记关键词 4. 在Word文档中批量替换关键词 使用Python实现Word文档的自动化处理,包括批量生成Word文档.在Word文档中批量进行查找和替换.将Word文档批量转换成PDF等. 1. 批量生成Word文档 安装openpyxl模块 pip install openpyxl 安装python-docx模块 pip install python-docx openpyxl模块可以读写扩展

  • Python pyinotify模块实现对文档的实时监控功能方法

    0x01 安装pyinotify >>> pip install pyinotify >>> import pyinotify 0x02 实现对文档的试试监控功能 这个功能类似与Ubuntu里的rail -f功能,在对目标文件进行修改时,脚本可以实时监控并将新的修改打印出来. import pyinotify import time import os class ProcessTransientFile(pyinotify.ProcessEvent): def pro

  • python错误调试及单元文档测试过程解析

    这篇文章主要介绍了python错误调试及单元文档测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 错误分为程序的错误和由用户错误的输入引起的错误,此外还有因为各种各样意外的情况导致的错误,比如在磁盘满的时候写入.从网络爬取东西的时候,网络断了.这类错误称为异常 错误处理 普通的错误处理机制就是在出错的时候返回一个错误代码,但是这样十分不方便,一是因为错误码是和正常结果一样的方式返回的,判断起来十分不方便,二是错误还需要一级一级的向上报

  • Python自动化办公之Word文档的创建与生成

    目录 保存生成 word 生成标题 生成段落 添加图片 添加表格 分页 上几章节我们主要学习了如何读取文章,而主要任务是读取文档中的文本信息,也就是字符串,而图片本身是不可读的文件所以并没有去读取图片.从今天开始将学习如何通过 python 脚本来自动生成一个 word 文档. 保存生成 word 在学习如何生成一个 word 文档之前,我们来看看如何保存生成 word 文件,因为马上就会用到. 使用方法: document_obj.save(文件地址) ---> /home/demo.docx

  • Python+OpenCV实战之实现文档扫描

    目录 1.效果展示 2.项目准备 3.代码的讲解与展示 4.项目资源 5.项目总结与评价 1.效果展示 网络摄像头扫描: 图片扫描: 最终扫描保存的图片: (视频) (图片) 2.项目准备 今天的项目文件只需要两个.py文件,其中一个.py文件是已经写好的函数,你将直接使用它,我不会在此多做讲解,因为我们将会在主要的.py文件import 导入它,如果想了解其中函数是如何写的,请自行学习. utlis.py,需要添加的.py文件 import cv2 import numpy as np # T

  • Python 使用tf-idf算法计算文档关键字权重并生成词云的方法

    Python 使用tf-idf算法计算文档关键字权重,并生成词云 1. 根据tf-idf计算一个文档的关键词或者短语: 代码如下: 注意需要安装pip install sklean: from re import split from jieba.posseg import dt from sklearn.feature_extraction.text import TfidfVectorizer from collections import Counter from time import

  • Python实现将DOC文档转换为PDF的方法

    本文实例讲述了Python实现将DOC文档转换为PDF的方法.分享给大家供大家参考.具体实现方法如下: import sys, os from win32com.client import Dispatch, constants, gencache def usage(): sys.stderr.write ("doc2pdf.py input [output]") sys.exit(2) def doc2pdf(input, output): w = Dispatch("W

  • python编写暴力破解zip文档程序的实例讲解

    编写暴力破解Zip文件要从学习zipfile库的使用方法入手,首先打开Python解释器,用help('zipfile')命令来了解这个库并重点看一下ZipFile类中的extractall()这个方法 ZipFile extractall() 让我们来写一个脚本测试一下Zip文件库的用法,首先创建一个有密码的压缩文件,这里设置密码为awd,文件名为evil.zip,要解压这个zip文件,实例化一个新的ZipFile类,使用extractall()方法,在可选参数pwd上填上密码 运行后你会发现

随机推荐