チュートリアル

簡単にライブラリーを使用するためのチュートリアルコレクション

2026-11-13

Python でテキストファイル(TXT)を PDF に変換する方法

業務マニュアル、社内規程、手順書——こうした文書はまずテキストファイルで書かれ、配布の段階で PDF にまとめる、という流れがよくあります。PDF にしておけば、フォントや余白、改ページの位置まで含めて 1 つのファイルとして渡せます。

本記事では、Spire.PDF for Python を使って TXT ファイルを PDF に変換する手順を紹介します。やることは「テキストを読み取って、ページに描く」だけです。ただし、日本語フォントの選び方と、行間・改ページの指定によって仕上がりが大きく変わります。実際の出力を見ながら、設定を詰めていきます。

クイックナビゲーション


TXT から PDF への変換で行うこと

TXT ファイルに入っているのは、文字と改行だけです。フォントも余白もページの区切りも持っていないので、PDF にするときは「どの書体で、どれくらいの行間で、どこまで入ったら次のページへ送るか」を Python 側で決めます。

処理 使用するクラス・メソッド
テキストの読み取り open()(標準のファイル読み込み)
ドキュメントとページの用意 PdfDocument / PdfDocument.Pages.Add()
日本語フォントとブラシ PdfCjkStandardFont / PdfBrushes
行間・行揃え・字下げ PdfStringFormat
描画と改ページ PdfTextWidget.Draw() + PdfTextLayout
PDF の保存 PdfDocument.SaveToFile()

この処理の中心になるのが PdfTextWidget です。1 ページ分の文字列ではなく、読み取ったテキスト全体を渡すのがポイントで、「複数ページにまたがるテキスト領域」を表します。PdfTextLayout の Layout に Paginate を指定すると、ページに入りきらない部分は自動で次のページへ送られます。


環境の準備とサンプルテキスト

pip install spire.pdf

スクリプトでは、次の 2 つを読み込みます。spire.pdf.common には座標やサイズを表すクラスが入っています。

from spire.pdf import *
from spire.pdf.common import *

サンプルには、4 章構成の業務マニュアルをプレーンテキストで用意しました。

項目 内容
ファイル名 業務マニュアル.txt
行数 67 行
文字数 1,594 文字
文字コード UTF-8

見出しと本文が空行で区切られた、ごく普通のテキストファイルです。文字コードは open() の encoding に合わせて指定します。UTF-8 のファイルなら encoding="utf-8"、Shift_JIS のファイルなら encoding="shift_jis" を指定します。


テキストを読み取って PDF に描画する

テキストを読み取り、A4 のページに明朝体で流し込みます。ページの余白は 56 ポイント(約 2 cm)に設定します。

import os
from spire.pdf import *
from spire.pdf.common import *

# テキストファイルを読み取る
with open("業務マニュアル.txt", "r", encoding="utf-8") as f:
    text = f.read()

# PDF ドキュメントを作成し、余白を 56 ポイントに設定する
pdf = PdfDocument()
pdf.PageSettings.Margins = PdfMargins(56.0)
page = pdf.Pages.Add()

# 日本語を表示できるフォントと、黒のブラシを用意する
font = PdfCjkStandardFont(PdfCjkFontFamily.HeiseiMinchoW3, 11.0)
brush = PdfBrushes.get_Black()

# 行間と行揃えを指定する
string_format = PdfStringFormat()
string_format.LineSpacing = 16.0
string_format.Alignment = PdfTextAlignment.Justify

# ページに収まらないテキストを次のページへ送る
text_layout = PdfTextLayout()
text_layout.Break = PdfLayoutBreakType.FitPage
text_layout.Layout = PdfLayoutType.Paginate

# テキストウィジェットを作成し、ページに描画する
text_widget = PdfTextWidget(text, font, brush)
text_widget.StringFormat = string_format

canvas = page.Canvas.ClientSize
bounds = RectangleF(PointF(0.0, 30.0), SizeF(canvas.Width, canvas.Height - 30.0))
text_widget.Draw(page, bounds, text_layout)

# PDF として保存する
os.makedirs("output", exist_ok=True)
pdf.SaveToFile("output/業務マニュアル.pdf", FileFormat.PDF)
page_count = pdf.Pages.Count
pdf.Close()

print("保存しました: output/業務マニュアル.pdf")
print("ページ数:", page_count)
print("ファイルサイズ:", os.path.getsize("output/業務マニュアル.pdf"), "bytes")

描画範囲に指定している page.Canvas.ClientSize は、用紙サイズから余白を除いた領域です。上端を 30 ポイント下げた分だけ高さを縮めて渡しているので、最終行は下の余白の内側に収まります。

PdfTextWidget のコンストラクターには、テキスト・フォント・ブラシの 3 つを渡します。フォントとブラシを先に作っておけば、同じ体裁のまま別のページや別のドキュメントにも描画できます。

変換元のテキストファイルと、変換後の PDF を並べると次のようになります。

テキストファイルと変換後の PDF の比較

このスクリプトを txt_to_pdf.py として保存して実行すると、保存先・ページ数・ファイルサイズが表示されます。

TXT から PDF への変換を実行したときのコンソール出力

1,594 文字のテキストから、2 ページの PDF ができました。Pages.Add() で追加したのは 1 ページだけですが、入りきらない部分は自動で次のページに送られています。この仕組みについては後半で詳しく見ていきます。


日本語フォントと文字サイズ

フォントは PdfCjkStandardFont にフォントファミリーとサイズを渡して作成します。日本語の書体は明朝体とゴシック体の 2 種類が用意されています。

フォントファミリー 書体 向いている用途
PdfCjkFontFamily.HeiseiMinchoW3 明朝体 本文、マニュアル、規程文書
PdfCjkFontFamily.HeiseiKakuGothicW5 ゴシック体 見出し、表、注記

長い本文を読ませる文書では明朝体が読みやすく、画面で拾い読みする資料ではゴシック体が見つけやすくなります。同じテキストでも、フォントファミリーを変えるだけで紙面の印象はかなり変わります。

# ゴシック体・12 ポイントで描画する
font = PdfCjkStandardFont(PdfCjkFontFamily.HeiseiKakuGothicW5, 12.0)

欧文用の PdfFont に PdfFontFamily.TimesRoman を指定すると、英数字はそのまま描かれます。日本語を含むテキストでは、日本語の字形を持つ PdfCjkStandardFont を使います。

文字サイズを大きくすると 1 行に入る文字数が減り、ページ数も増えます。用紙に収めたい文字量が決まっている場合は、サイズと余白をセットで調整します。フォントの指定については Python で PDF にさまざまなフォントを適用する方法 で詳しく解説しています。


行間・行揃え・字下げを整える

文字の体裁は PdfStringFormat で指定します。よく使うプロパティは次の 4 つです。

プロパティ 指定する内容 指定例
LineSpacing 行の高さ(ポイント) 16.0
Alignment 行揃え PdfTextAlignment.Justify
CharacterSpacing 文字同士の間隔(ポイント) 0.5
ParagraphIndent 段落全体の字下げ(ポイント) 18.0

LineSpacing は行の高さそのものを指定します。11 ポイントの本文なら 16〜18 ポイントが目安で、行が詰まらずに読めます。文字サイズを変えたときは、行間も一緒に見直すと版面のバランスが保てます。

Alignment に Justify を指定すると、行末が右端まで揃います。日本語は字間が均一なので、両端揃えにすると段落の輪郭が整い、長い本文でも読み進めやすくなります。

行間を広げると 1 ページに入る行数が減り、ページ数が増えます。行間だけを変えた 2 つの出力を比べると次のようになります。

import os
from spire.pdf import *
from spire.pdf.common import *

with open("業務マニュアル.txt", "r", encoding="utf-8") as f:
    text = f.read()

pdf = PdfDocument()
pdf.PageSettings.Margins = PdfMargins(56.0)
page = pdf.Pages.Add()

font = PdfCjkStandardFont(PdfCjkFontFamily.HeiseiMinchoW3, 11.0)
brush = PdfBrushes.get_Black()

# 行間を 24 ポイントに広げる
string_format = PdfStringFormat()
string_format.LineSpacing = 24.0
string_format.Alignment = PdfTextAlignment.Justify

text_layout = PdfTextLayout()
text_layout.Break = PdfLayoutBreakType.FitPage
text_layout.Layout = PdfLayoutType.Paginate

text_widget = PdfTextWidget(text, font, brush)
text_widget.StringFormat = string_format

canvas = page.Canvas.ClientSize
bounds = RectangleF(PointF(0.0, 30.0), SizeF(canvas.Width, canvas.Height - 30.0))
text_widget.Draw(page, bounds, text_layout)

os.makedirs("output", exist_ok=True)
pdf.SaveToFile("output/業務マニュアル_行間.pdf", FileFormat.PDF)
page_count = pdf.Pages.Count
pdf.Close()

print("保存しました: output/業務マニュアル_行間.pdf")
print("ページ数:", page_count)

行間の設定による版面の違い

行間 16 ポイントでは 2 ページ、24 ポイントでは 3 ページになりました。同じ文字数でも、行間を広げると 1 ページに入る行数が減るためです。配布先で印刷する場合は、行間を広げすぎず、ページ数と読みやすさのバランスで決めます。


長いテキストを複数ページに分割する

改ページの動きは PdfTextLayout の 2 つのプロパティで決まります。

プロパティ 指定する値 意味
Break PdfLayoutBreakType.FitPage ページに収まるところまで描き、続きを次のページへ送る
Layout PdfLayoutType.Paginate 入りきらない分のページを自動で追加する

この 2 つを組み合わせると、テキストの量に応じてページ数が決まります。行を足しても、改ページの位置は自動で調整されます。

2 ページ目への自動改ページ

2 ページ目も 1 ページ目と同じ体裁で描かれます。フォント・行間・余白の設定はページをまたいで引き継がれるため、ページごとに書式を指定し直すことなく、同じ体裁で出力されます。

用紙サイズを変えたい場合は、PageSettings.Size を指定します。既定は A4 です。

pdf.PageSettings.Size = PdfPageSize.B5()

A4 は 595 × 842 ポイント、B5 は 501 × 709 ポイントです。用紙が小さくなると 1 ページに入る行数が減るので、余白や文字サイズとあわせて調整します。テキストをページに描く基本は Python で PDF にテキストを追加する方法 でも扱っています。


まとめ

本記事では、Spire.PDF for Python を使ってテキストファイルを PDF に変換する手順を紹介しました。

  1. テキストを読み取る — open() でファイル全体を文字列として読み込みます。
  2. ページとフォントを用意する — PdfDocument にページを追加し、PdfCjkStandardFont で日本語フォントを指定します。
  3. 体裁を整える — PdfStringFormat の LineSpacing と Alignment で行間・行揃えを決めます。
  4. 描画して保存する — PdfTextWidget.Draw() に PdfTextLayout を渡し、SaveToFile() で PDF として保存します。

TXT ファイルの読み取りから PDF の保存までをスクリプトにしておけば、マニュアルの改訂のたびに同じ体裁で PDF を作り直せます。テキストの量が増えても、改ページは Paginate が処理します。

ほかの形式から PDF への変換は Python で SVG ファイルを PDF 形式に変換・保存する方法 で解説しています。全機能を評価したい場合は、30 日間の無料ライセンスを申請 できます。


FAQ

日本語を正しく表示するために確認するポイントは?

フォントに PdfCjkStandardFont を指定しているか、open() の encoding がファイルの文字コードと一致しているかの 2 点です。UTF-8 のファイルなら encoding="utf-8"、Shift_JIS のファイルなら encoding="shift_jis" を指定します。本記事のサンプルは UTF-8 のファイルを明朝体で描画しています。

行間や文字サイズはあとから調整できますか?

PdfStringFormat.LineSpacing と PdfCjkStandardFont のサイズを変えて再実行するだけです。行間を広げるとページ数が増えるため、印刷範囲が決まっている場合は余白とあわせて調整します。

改ページの位置を指定できますか?

PdfTextLayout の Break と Layout の組み合わせで、ページに収まるところで自動的に改ページされます。章ごとにページを分けたい場合は、章ごとにテキストを分割して Pages.Add() でページを追加し、そのページに PdfTextWidget を描画します。

複数のテキストファイルを 1 つの PDF にまとめられますか?

まとめられます。ファイルごとにテキストを読み取り、Pages.Add() でページを追加しながら PdfTextWidget.Draw() を呼び出せば、1 つの PdfDocument に順番にページが積み上がります。

出力した PDF からテキストを取り出せますか?

PdfDocument で PDF を読み込み、ページのテキスト抽出機能を使うと取り出せます。手順は Python で PDF からテキストを抽出する方法 で解説しています。

Read 5 times