도서관 자료용 등 라벨을 Python 및 reportlab로 인쇄

18233 단어 reportlabPython3PDF

도서관 책의 뒷표지에 붙여진 그 라벨을 인쇄



키하라의 프린터용 도서 라벨, 3단조로 A4의 녀석(상품 번호 60663-※)에 데이터를 인쇄합니다. 그만큼.
우편 주문 상품 페이지는 이것입니다
htps://s 트레이닝. 쇼핑 g. 야 뺨. 이. jp / 무덤 오 k dy / C40-60663 아. html
대부분의 도서관용 라벨의 메이커는 인쇄용의 Excel 파일을 배포하고 있거나 합니다만, 그 파일에 데이터를 넣는 것이 상당한 수고이기도 하기 때문에, 만들어 보았습니다.
키하라 외에도 사이타마 복지회, 일본 부커, 일본 펀치 카드 공업의 A4 라벨용의 설정도 만들고 있습니다. 수요가 있는지.

Python3 및 reportlab에서 PDF 작성



딱딱하게 해설해 갑니다. 우선 라이브러리 가져오기에서.

PDF를 만드는 라이브러리 reportlab를 사용합니다.
표준 라이브러리가 아니므로 미리 pip로 설치해야합니다.
표준 라이브러리의 tkinter 는 약간의 입력 대화 상자를 표시하기 위해,sys는 취소 할 때 프로그램을 종료하므로,webbrowser 는 완성된 PDF를 미리 보고 그대로 인쇄하는데 사용합니다.
from reportlab.pdfgen import canvas
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.platypus import Table
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
import tkinter
import tkinter.simpledialog
import sys
import webbrowser
# 小さいウインドウを出なくするおまじない
root = tkinter.Tk()
root.withdraw()

먼저 글꼴, 용지, 라벨의 크기, 매수 등을 설정합니다.
MS 명조와 MS 고딕은 자신이 사용하므로 설정하고 있습니다.
포인트로서는, 인쇄 위치 결정에 사용하는 높이와 폭의 수치는 실측치가 되고 있습니다.
픽셀 단위로 밖에 조정할 수 없는 Excel의 셀의 크기를 감으로 조정하는 것은 종이를 몇장이나 낭비해 버립니다만, 눈금자로 측정해 수치를 입력해 조정은 여백 설정의 미조정 1회로 끝난다 는 아주 도움이 된다.
def labelprint(data):
    # 使用フォント登録
    pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
    pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3'))
    pdfmetrics.registerFont(TTFont('MS 明朝', 'C:\\Windows\\Fonts\\msmincho.ttc'))
    pdfmetrics.registerFont(TTFont('MS ゴシック', 'C:\\Windows\\Fonts\\msgothic.ttc'))
    # 印刷位置決めのため余白設定
    xmargin, ymargin = 18.0*mm, 20.5*mm
    # ラベル1枚ごとの高さと幅
    width, height = 29.02*mm, 30.94*mm
    # 用紙サイズと作成するPDFファイル名
    c = canvas.Canvas('labelprint.pdf', pagesize=A4)
    # 横方向ラベル枚数
    col = 6
    # 縦方向ラベル枚数
    row = 8
    # 1シートのラベル枚数
    count = row * col

사용 라벨 시트를 사용하는 경우, 처음부터 n매는 인쇄하지 않도록 할 수 있도록 했습니다.
이것은 의외 수요가있을 것 같기 때문에 추가했습니다.tkintersys 의 차례는 여기.
    # 使用済みラベル枚数入力
    inputdata = tkinter.simpledialog.askstring('ラベル作成', '使用済みラベル枚数を入力してください',)
    if inputdata == None:
        # 入力がキャンセルされたとき終了する
        sys.exit()
    elif inputdata.isdecimal():
        # 入力された枚数分空白をリストの先頭に挿入する
        for i in range(int(inputdata)):
            data.insert(0, [[''], [''], [''], ['']])

여기에서 데이터 쓰기.
1장째부터 48매째까지는 1시트째에 기입해, 49부터 96매째는 2시트째, 라고 하는 상태.
    # ここからPDF作成
    n = 0 
    # データ件数が1シートのラベル枚数で割り切れないとき
    # 余り部分の印刷用にページを1枚足す
    if len(data) % count > 0:
        n = 1
    for i in range(len(data) // count + n):
        # 1ページ毎に印刷の終了位置を設定しなおす
        if len(data) < (i + 1) * count:
            stop = len(data) - i * count
        else:
            stop = count
        for j in range(stop):
            # テーブルの描画位置を指定
            x = xmargin + width * (j % col)
            y = ymargin + height * (row - 1 - (j // col))
            # 書き込むデータを指定
            singledata = data[j + i * count]
            # 縦4段のテーブルを作成
            table = Table(singledata, colWidths=29.02*mm,
                                      rowHeights=(7.0*mm, 7.0*mm, 7.0*mm, 9.94*mm))
            # 書式を設定
            table.setStyle([('VALIGN', (0, 0), (0, 3), 'MIDDLE'),
                            # 3段目までの書式
                            ('ALIGN', (0, 0), (0, 2), 'CENTER'),
                            ('FONT', (0, 0), (0, 2), 'MS 明朝', 11),
                            # 4段目の書式
                            ('ALIGN', (0, 3), (0, 3), 'LEFT'),
                            ('FONT', (0, 3), (0, 3), 'MS ゴシック', 8),
                            # 枠線は描画しない
                            # ('INNERGRID', (0 ,0), (-1,-1), 0.25, colors.black),
                            # ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
            ])
            # テーブルを書き込み
            table.wrapOn(c, x, y)
            table.drawOn(c, x, y)
        # PDF1ページを書き込み
        c.showPage()
    c.save()
    # ブラウザでプレビューする。良ければそのまま印刷
    webbrowser.open('labelprint.pdf')


마지막으로 데이터를 준비하고 실행합시다.
실제 사용할 때는 openpyxl
# とりあえず60枚ほど印刷してみよう
labeldata = [[['分類記号'], ['図書記号'], ['副本記号'], [str(i + 1) + '枚目']] for i in range(60)]
labelprint(labeldata)

# ラベル1枚はこんな感じのリスト
singledata = [['1段目'], ['2段目'], ['3段目'], ['枠外']]
# こいつをさらにリストに格納して印刷用のデータとなります。

마무리는 이런 느낌


약간의 주의사항



완성된 PDF를 인쇄하기 전에, 자신이 인쇄에 실패했을 때의 패인을 소개. 프로그램이라든지 전혀 관계없는 녀석.
환경은 Windows10에서 Acrobat Reader DC에서 인쇄하고 있습니다.

패인 1: 프린터 용지 공급에 흔들림이 있음



주소 씰과 같은 것은 대체로 수동 급지 트레이에서 급지한다고 생각하지만, 당사 사무소의 공용 프린터(브라더의 흑백 레이저)는 수동 급지 트레이에서 종이를 흡입할 때 조금 비스듬하게 되기 쉽다.
프린터는 수동급지의 정확도가 좋은 것을 사용하십시오. 가능하면 세로 방향으로 급지하는 기종이 좋다.

패인 2: 인쇄할 때 「페이지 사이즈 처리」란 항목 보지 않는다



여기가 「용지 사이즈에 맞춘다」라든가 「특대 페이지를 축소」가 되어 있으면 사이즈 배율이 97%가 된다. 무슨 일이야? "실제 크기"를 선택합시다.

패인 3: 프린터 드라이버를 넣어 잊었다



페이지 사이즈 처리를 「실제의 사이즈」로 하고 있는데, 인쇄해 보면 역시 미묘하게 축소되고 있다.
어째서일까라고 생각하면 PC에 프린터의 드라이버가 인스톨 되어 있지 않고, 범용 드라이버로 인쇄하고 있었다. 아마도 경계선 없는 인쇄를 지원하지 않는 프린터를 고려하여 약간 줄어들 것입니다.
경계선 없는 인쇄에 대응한 프린터를 사용해, 그 기종의 드라이버를 인스톨 하면 축소되지 않고 인쇄할 수 있었다.

좋은 웹페이지 즐겨찾기