1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

reportlabを使ったPDF添付メール送信でプレビューの文字が消える話

Posted at

はじめに

こんにちは、Pittaです。この記事は"HeiseiKakuGo-W5"フォントを用いたPDFをメールで送ると文字消えが発生する、という注意喚起です。

結論

reportlabではデフォルトのフォントは使わずにちゃんとした他のフォントを使った方がいいよ。

PythonでPDF作成

PythonでPDFを作りたい時、重宝するのがreportlabというライブラリです。書き方等詳しいことはこちらの記事を参考にしてください。

デフォルトで使える日本語フォント

reportlabにデフォルトで組み込まれているフォントはHeiseiMin-W3HeiseiKakuGo-W5のふたつです(以下の記事参考)。

今回はHeiseiKakuGo-W5を使用します。

PDFを作る

サンプルのPDFを作ります。消えそうな漢字ばかりを集めてみました。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
import os

# ユーザのデスクトップのディレクトリを取得
file = "sample.pdf"
file_path = os.path.expanduser("~") + "/Desktop/" + file

# A4の新規PDFファイルを作成
page = canvas.Canvas(file_path, pagesize=portrait(A4))

pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))

page.setFont("HeiseiKakuGo-W5", 10)
page.drawString(250, 500, "親鸞対鬱鑑璽濱祇龍飛色")

# PDFファイルとして保存
page.save()

出力されたPDFを確認してみると、ちゃんと出来ています。

sample-image1.png

メール送信で消える文字

このPDFをGmailに添付して送ってみます。Gmailには受信したメールの添付資料を確認できるプレビュー機能があるのでそれで確認してみると…。

sample-image2.png

「対」が消えています。

このファイルをダウンロードしてみるとちゃんと表示されているので、プレビュー表示内のみの問題なようです。

対策

フォントを変えるしか対処法はわかりませんでした。
組み込みのもう一つのフォントはカッコよくないので(エセ日本語感のあるフォントです)、おとなしくMS明朝を使います。

外部フォントを使う場合は、.ttfファイルを Windows\fontsから探し(もしくは外部からダウンロードし)、フォントを登録します。

from reportlab.pdfbase.ttfonts import TTFont

MINCHO = "msmincho.ttc"
pdfmetrics.registerFont(TTFont('Mincho', MINCHO))

これで組み込みフォントと同様に外部フォントが使えるようになります。

終わりに

安定感のあるフォントを使おう!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?