業務マニュアル、社内規程、手順書——こうした文書はまずテキストファイルで書かれ、配布の段階で PDF にまとめる、という流れがよくあります。PDF にしておけば、フォントや余白、改ページの位置まで含めて 1 つのファイルとして渡せます。
本記事では、Spire.PDF for Python を使って TXT ファイルを PDF に変換する手順を紹介します。やることは「テキストを読み取って、ページに描く」だけです。ただし、日本語フォントの選び方と、行間・改ページの指定によって仕上がりが大きく変わります。実際の出力を見ながら、設定を詰めていきます。
クイックナビゲーション
- TXT から PDF への変換で行うこと
- 環境の準備とサンプルテキスト
- テキストを読み取って PDF に描画する
- 日本語フォントと文字サイズ
- 行間・行揃え・字下げを整える
- 長いテキストを複数ページに分割する
- まとめ
- FAQ
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 を並べると次のようになります。

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

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 ページ目も 1 ページ目と同じ体裁で描かれます。フォント・行間・余白の設定はページをまたいで引き継がれるため、ページごとに書式を指定し直すことなく、同じ体裁で出力されます。
用紙サイズを変えたい場合は、PageSettings.Size を指定します。既定は A4 です。
pdf.PageSettings.Size = PdfPageSize.B5()
A4 は 595 × 842 ポイント、B5 は 501 × 709 ポイントです。用紙が小さくなると 1 ページに入る行数が減るので、余白や文字サイズとあわせて調整します。テキストをページに描く基本は Python で PDF にテキストを追加する方法 でも扱っています。
まとめ
本記事では、Spire.PDF for Python を使ってテキストファイルを PDF に変換する手順を紹介しました。
- テキストを読み取る —
open()でファイル全体を文字列として読み込みます。 - ページとフォントを用意する —
PdfDocumentにページを追加し、PdfCjkStandardFontで日本語フォントを指定します。 - 体裁を整える —
PdfStringFormatのLineSpacingとAlignmentで行間・行揃えを決めます。 - 描画して保存する —
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 からテキストを抽出する方法 で解説しています。






