質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2167閲覧

生成したバーコードを綺麗に縮小したい

wakkii111

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/04/25 00:44

編集2023/04/25 01:48

実現したいこと

小さいサイズのPDFもしくは画像にバーコードを表示したい。
できればPythonがよいが別言語でも可

前提

社内製品識別用のバーコード付きラベルを印刷したい
ラベルプリンタメーカーの用意しているテンプレート・ソフトを利用してもよいが、PCごとに環境を整えるのが面倒なのでラベルサイズの小さい(40mm×60mmほど)PDFまたは画像を生成し、直接印刷したい。

発生している問題・エラーメッセージ

python-barcodeでバーコードを生成し、サイズに合わせて縮小すると画像が荒くなってしまい読み取りが困難
きれいなバーコードを生成する方法が知りたい。

### 該当のソースコード

python

import os from reportlab.lib.units import mm from reportlab.pdfgen import canvas from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase import pdfmetrics import barcode from barcode.writer import ImageWriter from PIL import Image file = "label.pdf" file_path = os.path.expanduser("~") + "/Desktop/" + file pdf_width, pdf_height = 62 * mm, 40 * mm c = canvas.Canvas(file_path, pagesize=(pdf_width, pdf_height)) hinban = "11111-1111" konpou_bangou = "230424008000" suryo = "100" bc = barcode.get_barcode_class('ean13') img = bc(konpou_bangou,writer=ImageWriter()) img.save('barcode') img = Image.open('C:/Users/user/Desktop/barcode.png') img_resize = img.resize((img.width // 4, img.height // 4), Image.ANTIALIAS) img_resize.save('C:/Users/user/Desktop/barcode1.png') pdfmetrics.registerFont(TTFont("HGRGE", "C:/Windows/Fonts/HGRGE.TTC")) c.setFont("HGRGE", 12) c.line(1*mm, 1*mm, 1*mm, 39*mm) c.line(1*mm, 39*mm, 61*mm, 39*mm) c.line(61*mm, 39*mm, 61*mm, 1*mm) c.line(61*mm, 1*mm, 1*mm, 1*mm) c.drawString(3*mm, 34*mm,hinban) c.drawString(3*mm, 29*mm,suryo+"pcs") img_path = os.path.expanduser("C:/Users/user/Desktop") + "/barcode1.png" # 画像ファイルの挿入 c.drawImage(img_path, 3*mm, 3*mm) c.showPage() c.save() subprocess.Popen(["start", "", r"C:/Users/user/Desktop/label.pdf"], shell=True) ### 試したこと python-barcodeで直接小さなサイズのバーコードを出力(まだうまくいっていない) ### 補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2023/04/25 01:09

縮小するのではなく最初からそのサイズで作ればよいのでは?
wakkii111

2023/04/25 01:46

ご指摘ありがとうございます。 python-barcodeのoptionでサイズしてできるとの記述を見つけたのでテストしてみます。 今は数字変更してもサイズ変更が実施されないので、調査中です。 bc = barcode.get('ean13', writer=ImageWriter(), # バーコードの種類を指定 options={'format': 'png', # 画像の形式を指定 'height': 10, # バーコードの高さを指定 'width': 0.8, # バーコードの幅を指定 'quiet_zone': 1}) # 静止ゾーンのサイズを指定 #bc = barcode.get_barcode_class('ean13') img = bc(konpou_bangou,writer=ImageWriter())
m.ts10806

2023/04/25 02:10

Python詳しくないのとコードが一部なのでなんとも言えませんが、その書き方だと単にoptionsという変数を定義しただけになってませんか? ライブラリの実行オプションとして渡さないと全てデフォルト値になると思います。
wakkii111

2023/04/25 02:55

ご丁寧にありがとうございます。 ご指摘の通り、うまく実行オプションに渡すことができていませんでした。 .saveの引数として渡してやるとうまくサイズ変更することができました。 そして、縮小したものよりかなり高品質なバーコードが得られました。 本当にありがとうございました。
m.ts10806

2023/04/25 03:15

私はあくまでPython識者ではなくあくまで経験則の感覚でコメントしてるだけなので、ご自身で顛末をまとめて回答を投稿し(特に質問時と方針変わったわけですからそのあたりも)、自己解決とされると良いと思います。
guest

回答1

0

自己解決

バーコードを縮小するのではなく、小さいバーコードを出力すべきとご指摘いただき
Python-barcodeライターオプションでサイズを指定し出力することで、小さなバーコードを出力できました。
縮小するよりも格段にきれいなバーコードとなりました。

import os
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
import barcode
from barcode.writer import ImageWriter
from PIL import Image

file = "label.pdf"
file_path = os.path.expanduser("~") + "/Desktop/" + file

pdf_width, pdf_height = 62 * mm, 40 * mm
c = canvas.Canvas(file_path, pagesize=(pdf_width, pdf_height))

hinban = "11111-1111"
konpou_bangou = "230424008000"
suryo = "100"

bc = barcode.get('ean13', writer=ImageWriter())

#bc = barcode.get_barcode_class('ean13')

img = bc(konpou_bangou,writer=ImageWriter())

img.save('barcode',options={'module_height':3,'module_width': 0.1,'quiet_zone': 0.5,'font_size':2,'text_distance':0.5})

img = Image.open('C:/Users/user/Desktop/barcode.png')

img_resize = img.resize((img.width // 4, img.height // 4), Image.ANTIALIAS)
img_resize.save('C:/Users/user/Desktop/barcode1.png')

pdfmetrics.registerFont(TTFont("HGRGE", "C:/Windows/Fonts/HGRGE.TTC"))

c.setFont("HGRGE", 12)

c.line(1mm, 1mm, 1mm, 39mm)
c.line(1mm, 39mm, 61mm, 39mm)
c.line(61mm, 39mm, 61mm, 1mm)
c.line(61mm, 1mm, 1mm, 1mm)

c.drawString(3mm, 34mm,hinban)
c.drawString(3mm, 29mm,suryo+"pcs")

img_path = os.path.expanduser("C:/Users/user/Desktop") + "/barcode.png"

画像ファイルの挿入

c.drawImage(img_path, 3mm, 3mm)

c.showPage()
c.save()

subprocess.Popen(["start", "", r"C:/Users/user/Desktop/label.pdf"], shell=True)

投稿2023/04/25 04:13

wakkii111

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問