👋

【python】日本語の文章をPDFファイルにし、Blob Storageに保存する

2024/08/20に公開

そもそも

日本語の文章をPDFファイルにし、Blobに保存する機会がありました。
文字化けやBlobにアップロードできなかったりと、四苦八苦しました。
同じことで苦労している方がいるかもしれないので、まとめます。

参考記事

https://mori-memo.hateblo.jp/entry/2024/04/21/171759

バージョン

  • python:3.11.9
  • azure-storage-blob:12.22.0
  • reportlab:4.2.2

ライブラリーをinstall

pip install azure-storage-blob reportlab   

code

main.py
import logging
from azure.storage.blob import BlobServiceClient
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.units import mm
from reportlab.lib.pagesizes import A4
from io import BytesIO

# ログ設定
logging.basicConfig(level=logging.INFO)


def create_pdf(content: str) -> BytesIO:
    """PDFを生成し、BytesIOオブジェクトとして返す"""
    pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
    buffer = BytesIO()
    pdf = canvas.Canvas(buffer, pagesize=A4)
    pdf.setFont("HeiseiKakuGo-W5", 12)
    pdf.drawString(10 * mm, 270 * mm, content)
    pdf.save()
    buffer.seek(0)
    return buffer


def upload_to_blob(blob_client, data: str, overwrite: bool = True) -> None:
    """PDFをAzure Blobストレージにアップロードする"""
    try:
        pdf_buffer = create_pdf(data)
        blob_client.upload_blob(pdf_buffer, blob_type="BlockBlob", overwrite=overwrite)
        logging.info(f"Uploaded to blob: {blob_client.blob_name}")
    except Exception as e:
        logging.error(f"Error uploading to blob: {e}")
        raise


def main():
    # Azure Blobストレージへの接続情報
    connection_string = "<接続文字列>"
    container_name = "<コンテナ名>"
    blob_name = "<pdfファイル名>"

    # BlobServiceClientのインスタンスを作成
    blob_service_client = BlobServiceClient.from_connection_string(connection_string)
    blob_client = blob_service_client.get_blob_client(
        container=container_name, blob=blob_name
    )

    # アップロードするデータ
    data = "これはテストの日本語テキストです。"

    # アップロード処理
    upload_to_blob(blob_client, data)


if __name__ == "__main__":
    main()

結果

Blobに保存されたことを確認する

中身を確認する

ヘッドウォータース

Discussion