




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PrintTim Golden Python Stuff Win32 How Do I.? Print IntroductionThe requirement: to printThis is probably the most wide-ranging question Ill have to address here, and the one with the greatest disparity between the number and complexity of solutions and the simplicity of the requirement. The answer is: it all depends what youre trying to print, what tools you have at your disposal, and how much control you need. If you simply have a document (read: file of a well-known type, associated with one application) you wish to print, and arent too fussy about controlling, then you can use the ShellExecute approach. This works (assuming you have the corresponding applications installed) for Microsoft Office documents, PDF files, text files, and pretty much any major application. Try it and see. The next most general case is where you have something, for example a text file or raw PCL, which you know you can send directly to a printer. In that case, you can use the win32print functions directly. If you have an image to print, you can combine the power of the Python Imaging Library with the win32ui module to do a rough-and-ready but useful print to any printer. If you have a fair amount of text to print, your best bet is to use the Reportlab PDF Toolkit and its Platypus document system to generate readable PDFs from any amount of text, and then use the ShellExecute technique to print it. Standard document: use ShellExecuteMake use of the fact that within Win32, file types (in effect, extensions) can be associated with applications via command verbs. Typically the same application will handle all verbs (and typically those verbs are Open and Print) but thats not strictly necessary. This means that you can tell the OS to take your file and call whatevers necessary to print it. Takes care of standard file types No need to mess around with printer lists Gives you no control Only works for well-defined document-application pairings. Only prints to default printer UPDATE: Kudos to Chris Curvey for pointing out that you can specify a printer by including it with a d: switch in the params section. Dont know if it works for every file type.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)UPDATE 2: Mat Baker & Michael micolous both point out that theres an underdocumented printto verb which takes the printer name as a parameter, enclosed in quotes if it contains spaces. I havent got this to work but they both report success for at least some file types.import tempfileimport win32apiimport win32printfilename = tempfile.mktemp (.txt)open (filename, w).write (This is a test)win32api.ShellExecute ( 0, printto, filename, %s % win32print.GetDefaultPrinter (), ., 0)Raw printable data: use win32print directlyThe win32print module offers (almost) all the printing primitives youll need to take some data and throw it at a printer which has already been defined on your system. The data must be in a form which the printer will happily swallow, usually something like text or raw PCL. Quick and easy You can decide which printer to use Data must be printer-ready 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 testhPrinter = 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)Single image: use PIL and win32uiWithout any extra tools, printing an image on a Windows machine is almost insanely difficult, involving at least three device contexts all related to each other at different levels and a fair amount of trial-and-error. Fortunately, there is such a thing as a device-independent bitmap (DIB) which lets you cut the Gordian knot - or at least some of it. Even more fortunately, the Python Imaging Library supports the beast. The following code does a quick job of taking an image file and a printer and printing the image as large as possible on the page without losing the aspect ratio, which is what you want most of the time. It works You can decide which printer to use (Thanks to the PIL) You can select loads of image formats If youre not up on Windows device contexts, its not the most intelligble of techniques. 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 its 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.size0 bmp.size1: bmp = bmp.rotate (90)ratios = 1.0 * printable_area0 / bmp.size0, 1.0 * printable_area1 / bmp.size1scale = 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.sizex1 = int (printer_size0 - scaled_width) / 2)y1 = int (printer_size1 - scaled_height) / 2)x2 = x1 + scaled_widthy2 = y1 + scaled_heightdib.draw (hDC.GetHandleOutput (), (x1, y1, x2, y2)hDC.EndPage ()hDC.EndDoc ()hDC.DeleteDC ()Given the technique (creating a device context) you could use any of the standard Windows functions on it, such as DrawText, BitBlt &c. eg (example from pywin32 documentation): import win32uiimport win32printimport win32conINCH = 1440hDC = win32ui.CreateDC ()hDC.CreatePrinterDC (win32print.GetDefaultPrinter ()hDC.StartDoc (Test doc)hDC.StartPage ()hDC.SetMapMode (win32con.MM_TWIPS)hDC.DrawText (TEST, (0, INCH * -1, INCH * 8, INCH * -2), win32con.DT_CENTER)hDC.EndPage ()hDC.EndDoc ()Lots of text: generate a PDFYou could just send text directly to the printer, but youre at the mercy of whatever fonts and margins and what-have-you the printer has defined. Rather than start emitting raw PCL codes you can generate PDFs and let Acrobat look after printing. The Reportlab toolkit does this supremely well, and especially its Platypus document framework, which gives you the ability to generate pretty much arbitrarily complex documents. The example below hardly scratches the surface of the toolkit, but shows that you dont need two pages of setup code to generate a perfectly usable PDF. Once this is generated, you can use
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第13课 左耳刀与竖心旁教学设计-2025-2026学年小学书法练习指导四年级上册西泠版
- 建筑装修施工合同
- 统编部编三下语文班主任工作总结公开课教案教学设计公开课教案教学设计(2025-2026学年)
- Unit 4 My Favourite Subject说课稿 2024-2025学年人教版(2024)七年级英语上册
- 27.2.3 相似三角形应用举例说课稿2024-2025学年人教版数学九年级下册
- 股票发行法律服务合同-配股服务合同5篇
- 第3课 说课稿-七年级上学期体育与健康
- 第4课 操控自如-键盘控制说课稿-2023--2024学年清华大学版(2012)初中信息技术九年级上册
- 2025起重机操作员聘请合同书
- 2025餐厅卫生清洁服务承包合同模板关于餐厅清洁承包合同
- 初三中考备考家长会课件
- 2025电焊安全考试题库及答案
- 工伤补助免责协议书
- 《运动处方》课件-第二章 健康评估与风险筛查
- 先进自动化生产线整体采购及售后服务协议
- 温州市普通高中2025届高三第三次适应性考试物理试题及答案
- 施工、设计、勘察等各环节协同管理策略探讨
- 《关节滑膜肉瘤》课件
- 初中数学问题解决策略 特殊化 课件2024-2025学年北师大版(2024)数学七年级下册
- DB51-T 3257-2025 Ⅷ级、Ⅸ级内河航道通航规范
- 《中华人民共和国产品质量法》知识培训
评论
0/150
提交评论