txt2pdf.py 技術ドキュメント

プログラムの動作

txt2pdf.py は、プレーンなテキストファイル(通常は .txt 拡張子を持つファイル)をPDF形式のドキュメントに変換するPythonスクリプトです。このプログラムの主な目的は、テキストファイルの内容を、レイアウトが整った形でPDFとして保存することであり、特に日本語を含むテキストの変換をサポートするように設計されています。

主な機能は以下の通りです。

  • テキストファイルの読み込み: UTF-8エンコーディングでテキストファイルの内容を読み込みます。

  • 日本語フォントの自動検出と選択: Windows, macOS, Linuxなどの一般的なOS環境において、日本語表示が可能なフォント(例: ゴシック体)を自動で検索し、利用します。これにより、ユーザーが手動でフォントパスを指定することなく、日本語テキストを正しくPDFに埋め込むことができます。

  • PDF生成: fpdf ライブラリを使用して、読み込んだテキストコンテンツを新しいPDFファイルとして出力します。

  • 自動改ページ: テキストがページの終わりに達すると、自動的に新しいページが追加され、テキストの表示が継続されます。

  • 出力ファイル名の柔軟な設定: 入力ファイル名から自動的に出力PDFファイル名を決定する機能と、ユーザーが任意の出力ファイル名を指定できる機能を提供します。

  • エラーハンドリング: 入力ファイルが存在しない、ファイルが空である、あるいは日本語フォントが見つからないといった一般的なエラー状況を検出し、適切なメッセージを表示します。

このプログラムは、報告書やメモなどのテキストコンテンツを、印刷や共有に適したPDF形式に変換したいというニーズを解決します。

原理

txt2pdf.py は、テキストファイルをPDFに変換するために、主に以下のアルゴリズムとライブラリ機能を活用しています。

  1. パス解決と初期チェック:

    • 入力ファイルパスと出力ファイルパスは、os.path.abspath を用いて絶対パスに変換されます。

    • 出力パスが指定されていない場合、入力ファイルパスの拡張子を .pdf に変更して自動生成されます。

    • 入力ファイルの存在とファイルサイズ(空でないこと)が検証されます。

  2. 日本語フォントの検索アルゴリズム: find_font_path 関数は、日本語表示を可能にするフォントファイルを探索するための複数の戦略を実装しています。

    • ユーザー指定: コマンドライン引数 --font でフォントパスが明示的に指定されていれば、それが最優先で使用されます。

    • Windows環境: SYSTEMROOT 環境変数を利用して C:\Windows\Fonts ディレクトリを特定し、msgothic.ttc フォントを探します。

    • 固定候補パス: 以下の一般的なシステムフォントパスを順に試行します。

      • C:\Windows\Fonts\msgothic.ttc (Windows)

      • /System/Library/Fonts/ヒラギノ角ゴシック W4.ttc (macOS)

      • /Library/Fonts/Arial Unicode.ttf (macOS - 英語圏システムでの日本語対応)

      • /usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc (Linux - Noto CJKフォント)

      • /usr/share/fonts/truetype/noto/NotoSansCJKjp-Regular.otf (Linux - Noto CJK Japaneseフォント)

    • これらのパスのいずれかで有効なフォントファイルが見つかると、そのパスが返されます。見つからなかった場合は、PDF変換処理はエラーとなります。

  3. テキストコンテンツの読み込み:

    • Path(input_path).read_text(encoding="utf-8") を使用して、入力テキストファイルをUTF-8エンコーディングで読み込みます。これにより、日本語文字を含むテキストが正しく処理されます。

  4. PDF生成とレイアウト:

    • fpdf.FPDF() クラスのインスタンスが作成され、PDFドキュメントが初期化されます。

    • pdf.set_auto_page_break(auto=True, margin=15) により、ページ下部から15mmのマージンに達すると自動的に改ページされる設定が有効になります。

    • pdf.add_font("DOCFONT", "", chosen_font) で、見つかった日本語フォントが DOCFONT というカスタム名でPDFドキュメントに組み込まれます。

    • pdf.set_font("DOCFONT", size=12) で、ドキュメントのデフォルトフォントが DOCFONT、サイズ12ポイントに設定されます。

    • テキストコンテンツは splitlines() で行ごとに分割されます。

    • 各行は pdf.multi_cell(0, 7, line if line else " ") メソッドでPDFに追加されます。

      • 0: セルの幅がページの残り幅全体になるように指定します。

      • 7: 行の高さ(単位はmm、デフォルト)を指定します。

      • line if line else " ": 空行の場合でもPDF上で視覚的な空行として表現するために、単一の半角スペースをセルに渡します。

    • テキストの追加が完了すると、pdf.output(output_path) により指定されたパスにPDFファイルが保存されます。

この一連のアルゴリズムにより、テキストファイルの内容が適切に整形され、日本語表示が可能なPDFファイルとして出力されます。

必要な非標準ライブラリとインストール方法

このプログラムは fpdf ライブラリに依存しています。実際には fpdf2 パッケージとして配布されており、これをインストールすることで fpdf モジュールとして利用可能になります。

インストール方法は以下の pip コマンドを使用します。

pip install fpdf2

必要な入力ファイル

txt2pdf.py が必要とする入力ファイルは、以下の特徴を持つプレーンテキストファイルです。

  • ファイル形式: 特に拡張子に制限はありませんが、一般的には .txt ファイルを想定しています。

  • エンコーディング: プログラムは encoding="utf-8" でファイルを読み込むため、入力ファイルはUTF-8エンコーディングで保存されている必要があります。日本語文字を正しく表示するためには、このエンコーディングが推奨されます。

  • データ構造: 特定の構造は要求されません。通常のテキストコンテンツ(文章、コード、ログなど)をそのまま変換できます。

入力ファイルが存在しない場合や、ファイルが空の場合(サイズが0バイト)は、エラーメッセージが表示され、PDF変換は行われません。

生成される出力ファイル

プログラムが正常に動作した場合、以下の特徴を持つPDFファイルが生成されます。

  • ファイル名:

    • もしコマンドライン引数で出力ファイルパス (output_path) が指定されなかった場合、入力ファイルのパスから拡張子を .pdf に変更したファイル名が自動的に生成されます。 例: input.txtinput.pdf

    • 出力ファイルパスが指定された場合は、そのパスとファイル名でPDFが保存されます。

  • 内容: 入力テキストファイルの内容が、PDFドキュメントとしてレンダリングされます。

    • テキストはページごとに配置され、長い行は自動的に折り返されます。

    • 元のテキストの改行はPDF上でも維持されます。

    • 空行も視覚的に維持されるように処理されます。

    • 選択された日本語フォント(または指定されたフォント)がPDFに埋め込まれるため、PDFリーダーの環境に依存せず、日本語が正しく表示されます。

コマンドラインでの使用例 (Usage)

txt2pdf.py はコマンドラインツールとして設計されており、以下の基本的な構文で使用できます。

python txt2pdf.py <input_path> [output_path] [--font FONT_PATH] [--no-pause]
  • <input_path>:

    • 必須。PDFに変換したい入力テキストファイルへのパスを指定します。

  • [output_path]:

    • オプション。生成されるPDFファイルの保存先パスとファイル名を指定します。

    • 省略された場合、input_path のファイル名から拡張子を .pdf に変更した名前が、同じディレクトリに自動的に生成されます。

  • --font FONT_PATH:

    • オプション。日本語表示に使用したいTTF, OTF, または TTC フォントファイルへのパスを指定します。

    • この引数を省略した場合、プログラムはシステム内で日本語フォントを自動的に検索します。

  • --no-pause:

    • オプション。このフラグを指定すると、プログラムの実行終了時に「Press ENTER to terminate>>」というメッセージで一時停止することなく、すぐに終了します。スクリプトから自動実行する際などに便利です。

コマンドラインでの具体的な使用例

ここでは、txt2pdf.py の具体的な使用例とその実行結果について説明します。

事前に、sample.txt という内容のテキストファイルが存在すると仮定します。

これは日本語のサンプルテキストです。
改行も含まれています。

空行も認識されます。

これで終わりです。

1. 基本的な使用例 (出力ファイル名を自動生成)

入力ファイルを指定するだけの最もシンプルな使用方法です。出力ファイル名は自動的に sample.pdf となります。

python txt2pdf.py sample.txt

実行結果の説明: プログラムは sample.txt を読み込み、sample.pdf という名前のPDFファイルを生成します。コンソールには以下のようなメッセージが表示されます。

  Converting 'sample.txt' to PDF...
  Successfully converted to PDF: 'C:\path\to\your\directory\sample.pdf' (Windowsの場合)
  Successfully converted to PDF: '/path/to/your/directory/sample.pdf' (Linux/macOSの場合)

Program execution completed.
Press ENTER to terminate>>

C:\path\to\your\directory\/path/to/your/directory/ は実際のパスに置き換わります。) 生成された sample.pdf を開くと、sample.txt の内容が日本語フォントで表示されていることが確認できます。

2. 出力ファイル名を明示的に指定する例

生成されるPDFファイルに特定の名前を付けたい場合に使用します。

python txt2pdf.py sample.txt my_report.pdf

実行結果の説明: プログラムは sample.txt を読み込み、my_report.pdf という名前のPDFファイルを生成します。コンソールには以下のようなメッセージが表示されます。

  Converting 'sample.txt' to PDF...
  Successfully converted to PDF: 'C:\path\to\your\directory\my_report.pdf'

Program execution completed.
Press ENTER to terminate>>

my_report.pdf が作成され、sample.txt の内容がそこに変換されています。

3. 特定のフォントを指定する例

システムが自動検出できない場合や、特定のフォントを使用したい場合に --font 引数を使用します。

python txt2pdf.py sample.txt --font C:\Windows\Fonts\meiryo.ttc

実行結果の説明: このコマンドは、Windows環境の明朝体フォント meiryo.ttc を使用して sample.txt をPDFに変換し、sample.pdf を生成します。C:\Windows\Fonts\meiryo.ttc は例であり、実際にそのパスにフォントファイルが存在する必要があります。

  Converting 'sample.txt' to PDF...
  Successfully converted to PDF: 'C:\path\to\your\directory\sample.pdf'

Program execution completed.
Press ENTER to terminate>>

指定されたフォントがPDFに埋め込まれ、そのフォントでテキストがレンダリングされます。フォントファイルが見つからない場合はエラーメッセージが表示されます。

4. --no-pause オプションを使用する例

プログラムの実行後、すぐに終了させたい場合に便利です。

python txt2pdf.py sample.txt --no-pause

実行結果の説明: PDF変換処理が完了すると、プログラムは「Press ENTER to terminate>>」というメッセージを表示せずに、すぐに終了します。これはスクリプトやバッチ処理から txt2pdf.py を呼び出す場合に役立ちます。

  Converting 'sample.txt' to PDF...
  Successfully converted to PDF: 'C:\path\to\your\directory\sample.pdf'

Program execution completed.