はじめに
皆さん、「この画像を8cm × 4cmで印刷したい!」という時にどうすればいいかご存知でしょうか?
ちなみに私はわかりませんでした。
調べてみるとExcelでああしてWordではこうして・・と説明されるのですが面倒になって諦めました。
という訳で、pythonで実寸大印刷するコードを書いてみます。
※Windowsのみで動作します
コード
import win32print
import win32ui
from PIL import Image, ImageWin
class Printer:
# 下記はプリンタの固有情報を取得するためのキー
# http://chokuto.ifdef.jp/urawaza/api/GetDeviceCaps.html
WIDTH_IN_PIXEL = 8
HEIGHT_IN_PIXEL = 10
WIDTH_IN_MM = 4
HEIGHT_IN_MM = 6
LOGPIXELSX = 88
LOGPIXELSY = 90
PHYSICALWIDTH = 110
PHYSICALHEIGHT = 111
PHYSICALOFFSETX = 112
PHYSICALOFFSETY = 113
# 印刷したいサイズ(mm)から画像サイズ(px)を導き出す
def trans_mm_to_pixel(self, hDC, x_mm, y_mm):
printable_area_px = hDC.GetDeviceCaps (self.WIDTH_IN_PIXEL), hDC.GetDeviceCaps (self.HEIGHT_IN_PIXEL)
printable_area_mm = hDC.GetDeviceCaps (self.WIDTH_IN_MM), hDC.GetDeviceCaps (self.HEIGHT_IN_MM)
px_px, py_px = printable_area_px
px_mm, py_mm = printable_area_mm
result = (x_mm * px_px / px_mm, y_mm * py_px / py_mm)
return result
# パスで指定した画像を指定した大きさで印刷する
def print_image(self, image_path, x_mm, y_mm):
printer_name = win32print.GetDefaultPrinter()
hDC = win32ui.CreateDC ()
hDC.CreatePrinterDC (printer_name)
printable_area = hDC.GetDeviceCaps (self.WIDTH_IN_PIXEL), hDC.GetDeviceCaps (self.HEIGHT_IN_PIXEL)
printer_size = hDC.GetDeviceCaps (self.PHYSICALWIDTH), hDC.GetDeviceCaps (self.PHYSICALHEIGHT)
printer_margins = hDC.GetDeviceCaps (self.PHYSICALOFFSETX), hDC.GetDeviceCaps (self.PHYSICALOFFSETY)
hDC.StartDoc(image_path)
hDC.StartPage()
bmp = Image.open (image_path)
dib = ImageWin.Dib(bmp)
scaled_width, scaled_height = self.trans_mm_to_pixel(hDC, x_mm, y_mm)
# 中央に画像を印刷するように
x1 = int ((printer_size[0] - scaled_width) / 2)
y1 = int ((printer_size[1] - scaled_height) / 2)
x2 = int (x1 + scaled_width)
y2 = int (y1 + scaled_height)
dib.draw (hDC.GetHandleOutput(), (x1, y1, x2, y2))
hDC.EndPage ()
hDC.EndDoc ()
hDC.DeleteDC ()
画像印刷するコードは下記サイトを大いに参考にさせていただきました。
http://timgolden.me.uk/python/win32_how_do_i/print.html
実寸大で印刷するために、プリンタの印刷可能領域のmm値とpixel値から画像サイズを導出しています。
印刷してみる
正しい大きさで印刷できるか検証するために、ものさしの画像を印刷してみます。
次のコードを実行すると自動的に印刷を開始します(OSでデフォルト指定されたプリンターが動作します)
printer = Printer()
printer.print_image("4cm.jpg", 40, 40)
おわりに
pythonで簡単に?実寸大印刷することができました。
私の家のプリンターでしか試していないためすべての環境で動作することは保証できませんが、是非お試しあれ。