- 技術 💻
PDFに書き込む方法|無料の文字入力・手書き・署名と文字化けの直し方
結論
PDFに書き込むには、入力欄があれば欄をクリックして入力し、入力欄が無ければ閲覧ソフトの「テキストを追加」や描画(ペン)で上から書き足します。Windows は Edge、Mac は「プレビュー」、スマホは Google ドライブや「プレビュー」、どの OS でも Adobe Acrobat Reader が無料で使えます。
この記事でわかること
- 「欄に入力」「文字を足す」「手書きで丸」「署名」別のいちばん早い方法
- 書き込んだ文字がPDFのどこに入るか(注釈・フォーム・本文)と平坦化の実物
- 日本語が「??」や空白になる原因と、Python・qpdf での直し方
PDFに書き込む方法は、書き込んだものが入る場所で3つに分かれます。入力欄(フォーム)に入る、ページの上に「注釈」として貼られる、ページの本文そのものに描かれる、の3つです。どれを使ったかで、別のソフトで開いたときに見えるか・後から消せるかが変わります。
flowchart TD
S[PDFに書き込みたい] --> Q{入力欄がある?}
Q -->|ある| F[欄に入力]
Q -->|無い| N[注釈で足す<br>文字・ペン]
F --> X[平坦化<br>本文に焼き込む]
N --> X
N -.->|コードなら| P[本文に直接描く]
やりたいことごとに、いちばん早い方法を先にまとめます。
| やりたいこと | いちばん早い方法 | 詳しい節 |
|---|---|---|
| PDFの欄に入力したい(申込書など) | 欄をクリックして入力。欄が反応しなければ「テキストを追加」 | 書き込めるPDFかを見分ける |
| PDFに文字を足したい(入力欄が無い) | Edge・Acrobat Reader の「テキストを追加」、Mac はテキストボックス | Windows・Edge・Chrome |
| PDFに手書きで丸・線を書きたい | Edge・Chrome の「描画」、Android はドライブのアノテーション | iPhone・Android |
| PDFに署名したい | Mac の「署名」、Acrobat Reader の「署名またはイニシャルを追加」 | Mac のプレビュー/Acrobat Reader |
| 無料でPDFに書き込みたい | OS に入っている Edge・プレビュー、または無料の Acrobat Reader | 各 OS の節 |
| プログラムでPDFに文字入力したい | PyMuPDF の insert_text(日本語フォントを埋め込む) |
Pythonで書き込む |
| 書き込んだ日本語が「??」・空白になる | 日本語フォントを埋め込んで書き直す | 文字化けの原因と直し方 |
| 書き込んだ内容を消せないようにしたい | 平坦化(フラット化)してから渡す | 平坦化のやり方 |
| PDFに書き込めない | 保護(編集の制限)か、スキャン画像かを確かめる | 書き込めないPDF |
確認環境:Ubuntu 24.04.5 LTS の上で、Python 3.13.18 の作業用の仮想環境に pypdf 6.17.0・PyMuPDF 2.0(MuPDF 1.28.5)・reportlab 5.0.1 を用意し、reportlab で見本のPDF(入力欄なしの申込書と、テキスト欄・ラジオボタン・チェックボックスつきの申込書。日本語は IPAゴシックを埋め込み)を自作しました。そこに文字の書き込み・フォームへの入力・注釈・平坦化を行い、qpdf 11.9.0 で中身を展開し、poppler-utils 24.02.0(pdftotext・pdffonts・pdftoppm)と MuPDF の2つの描画エンジンで見え方を比べています。保護つきの見本も qpdf で自分で作りました。外部のサービスには PDF をアップロードしていません。Windows・Mac・iPhone・Android・Edge・Chrome・Acrobat Reader の操作は手元で動かしておらず、Microsoft Learn・Microsoft Edge の公式ページ・Google Chrome ヘルプ・Google ドライブ ヘルプ・Apple サポート・Adobe ヘルプで確かめた範囲だけを書いています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「PDFに書き込む方法|無料の文字入力・手書き・署名と文字化けの直し方」
PDFに書き込む方法は4種類(目的別の早見表)
この節では、「欄に入力」「文字を足す」「手書きで丸」「署名」の4つの目的ごとに、使う機能と書き込みが入る場所が分かります。
まず「そのPDFに入力欄があるか」で方法が決まります。 役所や会社の申込書には、クリックすると文字を打てる入力欄(フォーム)が付いているものがあります。入力欄が無いPDFは、紙に書き込むのと同じように、ページの上に文字や線を重ねます。
1欄に入力(フォーム入力)
入力欄をクリックして打つ。値はPDFの「フィールド」に入り、別のソフトでも欄の値として読める。チェックボックス・ラジオボタンもこの仲間。
2文字を足す(テキストボックス)
入力欄が無い場所に「テキストを追加」で文字を置く。多くの閲覧ソフトでは「注釈」として、ページの上に貼られる。
3手書きで丸・線・マーカー
ペン(インク)や蛍光ペンで描く。これも注釈として入る。後から消しゴムで消せる。
4署名
手書きの署名を描くか、画像として置く。見た目の署名と、証明書を使う電子署名は別物。
目的と方法の対応を表にまとめます。「入る場所」は、手元で見本のPDFに書き込んで qpdf で展開して確かめたものです。
| 目的 | 閲覧ソフトでの方法 | 入る場所 | 後から消せるか |
|---|---|---|---|
| 欄に入力 | 欄をクリックして入力 | フォームのフィールド(値は /V) |
消せる・書き換えられる |
| 文字を足す | テキストを追加・テキストボックス | 注釈(/FreeText) |
消せる |
| 手書きで丸 | 描画・ペン・アノテーション | 注釈(/Ink) |
消せる |
| マーカー | 強調表示・蛍光ペン | 注釈(/Highlight など) |
消せる |
| 平坦化したあと | 印刷して PDF にする・平坦化の機能 | ページの本文 | 普通の操作では消せない |
どれを選ぶか迷ったら、次の順で考えます。
- 1入力欄がある → 欄に入力する相手が値をデータとして読み取れる。いちばん崩れにくい
- 2欄が無く、文字を打ちたい → テキストを追加文字の大きさ・位置を後から直せる
- 3丸・チェック・下線だけ → 描画(ペン)スマホでは指やタッチペンで書くのが早い
- 4署名 → 署名の機能を使う本人確認が要る契約は、相手が指定する電子契約の方法に従う
- 5提出前に書き換えられたくない → 平坦化相手が入力欄の値を読む書類では平坦化しない
書き込めるPDFか見分ける(入力欄・保護・スキャン)
この節では、手元のPDFが「欄に入力できるか」「書き込みが禁止されていないか」「文字ではなく画像か」を見分ける方法が分かります。
入力欄の有無・保護・スキャン画像の3点を先に確かめると、どの方法を使えばよいかが決まります。 閲覧ソフトでは、欄をクリックしてカーソルが出るか、文字を選択できるかで分かります。コマンドで確かめる場合は、手元の見本では次のように出ました。
$ pdfinfo form.pdf | grep -E 'Form|Encrypted'
Form: AcroForm
Encrypted: no
$ pdfinfo plain.pdf | grep -E 'Form|Encrypted'
Form: none
Encrypted: no
$ pdfinfo P_locked.pdf | grep -E 'Form|Encrypted'
Form: AcroForm
Encrypted: yes (print:yes copy:yes change:no addNotes:no algorithm:AES-256)
Form: AcroForm は入力欄があるPDF、none は入力欄が無いPDFです。addNotes:no は、作成者が「注釈の追加」を許していないことを示します。スキャンしたPDFは、pdffonts でフォントが1つも出ず、pdftotext で文字が取り出せません(後の節で実物を示します)。
そのまま書き込める
入力欄がある(欄をクリックするとカーソルが出る)
入力欄は無いが保護も無い(テキストを追加で書ける)
スキャン画像でも、注釈なら上から書ける
そのままでは書き込めない
編集・注釈・フォーム入力が制限されている
開くのにパスワードが要り、知らない
閲覧ソフトがそのフォームの形式(XFA など)に対応していない
WindowsでPDFに書き込む(Edge・Chrome)
この節では、Windows に標準で入っている Microsoft Edge と、Google Chrome で PDF に文字・手書き・マーカーを書き込む方法が分かります(各社の公式ページで確かめた範囲)。
Windows では、追加のソフトを入れなくても Edge で PDF に書き込めます。 Microsoft Learn の「Microsoft Edge の PDF リーダー」には、インク操作(メモ・サイン・記入)、強調表示、テキスト ノート(コメント)、基本フォームの入力が機能として載っています。Microsoft Edge の公式の機能紹介ページには「テキストを追加」も載っています。
PDF を Edge で開く
PDF ファイルを Edge で開く。Edge には PDF リーダーが組み込まれていて、別のソフトを入れなくても表示と書き込みができる。
欄があれば欄に入力する
基本フォームの入力に対応。JavaScript を使うフォームと XFA 形式のフォームには対応していない、と Microsoft Learn に書かれている。
文字を足すなら「テキストを追加」
PDF ツールバーで「テキストを追加」を選び、置きたい場所を選んで入力する。テキストボックスは移動でき、フォントも変えられる。
丸・線はインク、マーカーは強調表示
インク操作で手書きのメモやサインを書ける(色と線の太さを変えられる)。文字を選んで右クリックし「強調表示」で色を選ぶとマーカーになる。
保存する
PDF ツールバーから、書き込みを含む PDF を保存する。元のファイルを残したいときは別名で保存する。
Chrome(パソコン)で書き込む
Google Chrome ヘルプ「Chrome で PDF を管理する」には、PDF ビューアで次の操作ができると書かれています。
- 手書き・マーカー:「描画」を選び、右側のパネルで「ペン」か「蛍光ペン」を選ぶ。サイズと色も選べる。「消しゴム」で消し、「元に戻す」「やり直し」が使える。
- 署名:「描画」→「ペン」で署名を書き、「完了」を選ぶ。
- 保存:ダウンロードのアイコンから「変更後のバージョン」か「変更前のバージョン」を選ぶ。「ドライブに保存」もある(シークレット モード・ゲスト プロファイルでは使えない)。
Chrome のヘルプには、入力欄の無い場所に文字を打ち込む手順は書かれていません。文字を打ちたいときは Edge か Acrobat Reader を使うのが確実です。
MacでPDFに書き込む(プレビューで文字入力・署名)
この節では、Mac に標準で入っている「プレビュー」で、PDF の欄に入力する方法と、署名を作って置く方法が分かります(Apple サポートで確かめた範囲)。
Mac は「プレビュー」だけで、欄への入力・テキストボックスの追加・署名ができます。 Apple サポート「Macの『プレビュー』でPDFフォームに入力する/署名する」の手順は次のとおりです。
欄をクリックして入力する
「プレビュー」で PDF を開き、フォームの欄をクリックして文字を入力する。
欄が反応しなければテキストボックス
「フォームの入力ツールバーを表示」ボタンをクリックし、テキストボックスのツールボタンでテキストボックスを足して入力する。
署名を作る
「マークアップツールバーを表示」→「署名」。トラックパッドに指で書く、白い紙に書いた署名をカメラに向ける、iPhone・iPad で書く、のどれかで作り「完了」。
署名を置く
署名の一覧から選び、置きたい場所にドラッグしてハンドルで大きさを合わせる。
一部の PDF では「フォームに自動入力」で連絡先の情報を入れられます。iCloud Drive をオンにしていると、同じ Apple ID のほかの Mac でも作った署名を使えます。
iPhone・AndroidでPDFに書き込む(スマホ)
この節では、スマホで PDF の欄に入力する方法と、指やタッチペンで手書きする方法が分かります(Apple サポート・Google ドライブ ヘルプで確かめた範囲)。
Android(Google ドライブ)
Android は Google ドライブ アプリで、手書きの注釈もフォーム入力もできます。
| やりたいこと | 手順(Google ドライブ ヘルプ) | 条件・注意 |
|---|---|---|
| 手書き・マーカー | PDF をプレビューで開く→右下のアノテーション ボタン→ツールバーでマーカーまたはペン・蛍光ペン・消しゴムを選ぶ | Android 6.0 以降。保存時に「元の PDF」か「新しい名前のコピー」を選ぶ |
| 欄に入力 | PDF をタップ→右下の編集アイコン→フォーム入力アイコン→入力→右上の「保存」 | フォーム入力のアイコンが出ない PDF には記入できない |
| 元を残す | その他アイコン→「名前を付けて保存」 | 新しい名前で保存すると、元の PDF は書き込み前のまま |
iPhone(プレビュー・マークアップ)
Apple サポートの iPhone ユーザガイドには「iPhoneでフォームに入力する/書類に署名する/署名を作成する」「iPhoneの『プレビュー』でPDFや画像に注釈を付ける」のページがあり、「プレビュー」で PDF フォームに入力したり署名を追加したりできること、PDF のテキストにハイライト・下線・取り消し線を付けられることが書かれています。ボタンの名前と画面は iOS の版で変わるため、ページ上部で使っている iOS の版を選んでから手順を確かめるのが確実です。
- iPhone・Android 共通で使える方法:Adobe Acrobat Reader のモバイル版。Adobe ヘルプ「Acrobat モバイル版の PDF フォーム」に手順があります。
Adobe Acrobat Reader(無料)でPDFに入力・署名する
この節では、無料の Adobe Acrobat Reader で、入力欄のある PDF にも無い PDF にも書き込む方法と、署名の注意点が分かります(Adobe ヘルプで確かめた範囲)。
Acrobat Reader の「入力と署名」は、入力欄の無い PDF(フラットフォーム)でも文字や記号を置けます。 Adobe ヘルプ「PDF フォームへの入力と署名」によると、入力欄のある「インタラクティブフォーム」と、入力欄の無い「フラットフォーム」のどちらにも使え、フラットフォームでは欄を自動で見つけて、足りない場所には手で文字や記号を置けます。
「入力と署名」を開く
グローバルバーの「電子サイン」か、すべてのツールから「入力と署名」を選ぶ。左にツールが出る。
文字を入れる
「フォームフィールドに入力」を選び、欄をクリックして入力。ドラッグで位置、「A」アイコンで大きさを変える。1文字ずつ枠に並べる「コーム」もある。
チェック・バツを付ける
「バツマークを追加」「チェックマークを追加」を選んで置く。
署名する
「署名またはイニシャルを追加」で、入力・描画・画像(JPG・PNG など)から署名を作り、置いて大きさを合わせる。
Adobe ヘルプには、次の注意が書かれています。
署名またはイニシャルをフォームに追加して保存すると、再度編集することはできません。
署名を入れる前に、ほかの欄をすべて見直してから保存する順番にすると、やり直しが減ります。
書き込んだ文字はPDFのどこに入るか(注釈・フォーム・本文)
この節では、同じ「山田 花子」を3つの方法で書き込んだとき、PDF の中で何が変わるのかを、手元で展開した実物で確かめられます。
注釈は「ページの上に貼った付箋」、本文への書き込みは「印刷された文字」、フォームは「欄の中の値」です。 見本の申込書(入力欄なし・24,273 バイト)に、PyMuPDF で本文に書く方法と注釈で貼る方法を試し、PyMuPDF で数えた注釈と、文字の取り出し結果を並べました。
--- plain.pdf annots=[]
has 山田 in page text: False
--- A_content_pymupdf.pdf annots=[]
has 山田 in page text: True
--- B_content_overlay.pdf annots=[]
has 山田 in page text: True
--- C_annots.pdf annots=[('FreeText', '山田 花子'), ('Ink', ''), ('Highlight', '')]
has 山田 in page text: True
注釈で貼ったファイル(C)を qpdf の --qdf で読める形に展開すると、ページに /Annots という一覧が付き、その中に次の辞書が入っていました。
/Contents <feff5c717530002082b15b50>
/DA (0 0 0 rg /Helv 12.0 Tf)
/F 4
/NM (fitz-A0)
/Rect [ 156 705.99978 446 727.99978 ]
/Subtype /FreeText
/T (t147)
/Type /Annot
/Contents の feff5c71… は「山田 花子」を UTF-16 で書いたものです。見た目は /AP(外観ストリーム)という別の描画データで決まります。一方、本文に書いたファイル(A)は、ページの描画命令そのものに文字が足されていました。
/ipag 12 Tf [<078c0b4900c6046107ab>]TJ
/ipag 12 Tf [<02eb02e502c700c602d602d102ba>]TJ
/ipag 12 Tf [<00d800d600d800dc0bf000d700d6064f00d800df0bdf>]TJ
入力欄つきの見本に PyMuPDF で入力したファイルは、欄ごとの辞書に値(/V)と、文字を描くときのフォント(/DA)が入りました。
/Subtype /Widget
/T (name)
/Type /Annot
/V <feff5c717530002082b15b50>
...
/DA (0.1 0.1 0.1 rg /Helv 12 Tf)
| 書き方 | 入る場所 | 閲覧ソフトで消せるか | 向く場面 |
|---|---|---|---|
| フォーム入力 | 欄(Widget)の /V+見た目 |
書き換えられる | 相手が値を集計する申込書 |
| 注釈(文字・手書き・マーカー) | ページの /Annots |
消せる・動かせる | 校正・メモ・確認の印 |
| 本文に描く | ページの描画命令 | 普通の操作では消せない | 帳票の自動作成・提出用の確定版 |
「保存したのに別のソフトで開くと文字が無い」というつまずきの多くは、注釈やフォームの「見た目」が、開いたソフトで描けないことが原因でした。この点は文字化けの節で実物を示します。
PythonでPDFに文字を書き込む(PyMuPDF・reportlab・pypdf)
この節では、入力欄の無い PDF にプログラムで文字・手書きの丸・マーカーを書き込むコードと、実行したときの時間とファイルの大きさが分かります。
本文に書くなら PyMuPDF の insert_text、または reportlab で作った文字だけの PDF を pypdf で重ねる方法が手軽です。 どちらも、日本語は TrueType 形式のフォントファイルを指定して埋め込みます。PyMuPDF は座標の原点が左上、reportlab は左下なので、同じ位置に書くには y を「ページの高さ − y」に変えます。
PyMuPDF で本文に書く
import pymupdf
IPA = "/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf"
H = 841.89 # A4 の高さ(pt)
doc = pymupdf.open("plain.pdf")
page = doc[0]
page.insert_text((156, H - 712), "山田 花子", fontname="ipag", fontfile=IPA, fontsize=12)
page.insert_text((156, H - 612), "2026年10月29日", fontname="ipag", fontfile=IPA, fontsize=12)
doc.subset_fonts() # 使った文字だけを埋め込む(これが無いと巨大になる)
doc.save("A2_subset.pdf", garbage=4, deflate=True)
reportlab で文字だけの PDF を作り、pypdf で重ねる
import io
from pypdf import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont("IPAGothic", "/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf"))
buf = io.BytesIO()
c = canvas.Canvas(buf, pagesize=A4)
c.setFont("IPAGothic", 12)
c.drawString(156, 712, "山田 花子") # reportlab は左下が原点
c.save()
over = PdfReader(io.BytesIO(buf.getvalue())).pages[0]
w = PdfWriter(clone_from="plain.pdf")
w.pages[0].merge_page(over)
w.write("B_content_overlay.pdf")
注釈で書く(テキストボックス・手書きの丸・マーカー)
doc = pymupdf.open("plain.pdf")
p = doc[0]
a1 = p.add_freetext_annot(pymupdf.Rect(156, H - 728, 446, H - 706), "山田 花子", fontsize=12, fontname="japan")
a1.update()
a2 = p.add_ink_annot([points]) # points は丸を描く座標の並び
a2.set_colors(stroke=(1, 0, 0)); a2.update()
a3 = p.add_highlight_annot(p.search_for("同意事項")[0]); a3.update()
doc.save("C_annots.pdf", garbage=3, deflate=True)
3通りを1回ずつ実行した時間と、できたファイルの大きさです。
| 方法 | 時間(1回) | 大きさ | メモ |
|---|---|---|---|
| 元の見本(入力欄なし) | ― | 24,273 バイト | |
| PyMuPDF で本文(フォントまるごと) | 486.0 ms | 4,359,510 バイト | IPAゴシック全体が入った |
上に subset_fonts() を足す |
+151 ms | 78,484 バイト | 使った文字だけに |
| reportlab+pypdf で重ねる | 50.6 ms | 39,159 バイト | reportlab は既定で使った文字だけ |
| PyMuPDF で注釈3つ | 18.1 ms | 27,015 バイト | フォントを埋め込まない |
pdffonts で見ると、まるごと埋め込んだときは sub 列が no、subset_fonts() のあとは TNTXCA+IPAGothic Regular のように名前の前に6文字が付き、sub 列が yes になりました。メールで送る書類なら、この1行で大きさが大きく変わります。
PythonでPDFフォームに入力する(pypdf・PyMuPDF)
この節では、入力欄つきの PDF にプログラムで値を入れる方法と、日本語の値を入れたときに起きたことが分かります。
値を入れること自体はどのライブラリでもできますが、日本語の「見た目」を正しく作れるかは別の問題です。 見本の欄(name・kana・date・kind・agree)に「山田 花子」「ヤマダ ハナコ」「2026-10-29」と、ラジオボタン・チェックボックスを入れました。
from pypdf import PdfWriter
w = PdfWriter(clone_from="form.pdf")
w.update_page_form_field_values(
w.pages[0],
{"name": "山田 花子", "kana": "ヤマダ ハナコ", "date": "2026-10-29"},
auto_regenerate=False,
)
w.update_page_form_field_values(w.pages[0], {"kind": "/onsite", "agree": "/Yes"}, auto_regenerate=False)
w.write("F1_pypdf.pdf")
実行すると、pypdf は次の警告を出しました(書き出しは成功)。
Text string '山田 花子' contains characters not supported by font encoding. This may result in text corruption. Consider calling writer.update_page_form_field_values with auto_regenerate=True.
Text string 'ヤマダ ハナコ' contains characters not supported by font encoding. This may result in text corruption. Consider calling writer.update_page_form_field_values with auto_regenerate=True.
PyMuPDF では、欄(ウィジェット)ごとに値を入れて update() を呼びます。
doc = pymupdf.open("form.pdf")
for wd in doc[0].widgets():
if wd.field_name == "name":
wd.field_value = "山田 花子"
wd.update()
elif wd.field_name == "agree":
wd.field_value = wd.on_state(); wd.update()
doc.save("F3_pymupdf.pdf")
どちらのファイルも、欄の値(/V)は正しく「山田 花子」になっていました。違いは見た目です。2つの描画エンジンで開いた結果をまとめます。
| ファイル | 欄の値 | poppler で見た目 | MuPDF で見た目 |
|---|---|---|---|
| pypdf で入力(F1) | 山田 花子 | 「?? ??」「??? ???」 | 「?? ??」「??? ???」 |
| PyMuPDF で入力(F3) | 山田 花子 | 空白(日付だけ見える) | 山田 花子 |
| NeedAppearances を true(F5) | 山田 花子 | 空白 | 山田 花子 |
| qpdf で見た目を作り直し(G6) | ―(平坦化) | 「?? ??」 | 「?? ??」 |
| 欄の位置に本文で書いた(G4) | ―(平坦化) | 山田 花子 | 山田 花子 |
NeedAppearances は「開くときに閲覧ソフトが見た目を作り直す」という指示です(pypdf のドキュメントの説明)。poppler で開いたときは、作り直そうとして日本語のフォントが見つからず、次の原文が文字ごとに出ました。
Syntax Error: HorizontalTextLayouter, couldn't find a font for character U+5C71
Syntax Error: HorizontalTextLayouter, couldn't find a font for character U+7530
Syntax Error: HorizontalTextLayouter, couldn't find a font for character U+82B1
U+5C71 は「山」、U+7530 は「田」、U+82B1 は「花」です。欄の値は正しいのに、見た目を作るフォントに日本語が無いと「??」や空白になる、というのが手元で確かめた結論です。相手が Acrobat Reader などで欄の値を読み直す書類なら値が正しければ届きますが、見た目のまま印刷・保管される書類は、次の節の平坦化まで行うのが安全です。
PDFの平坦化(フラット化)とは・やり方(PyMuPDF・qpdf・pypdf)
この節では、注釈や入力欄を本文に焼き込む「平坦化」の意味と、3つのツールで平坦化したときの違いが分かります。
平坦化は、注釈やフォームの「見た目」をページの本文に移し、注釈や欄そのものを消す処理です。 平坦化したあとは、閲覧ソフトで文字を動かしたり欄の値を書き換えたりできなくなります。PyMuPDF の bake() の説明には「ページの見た目は同じまま、注釈・フィールドは無くなり、フォームの PDF ではなくなる」と書かれています。
# PyMuPDF:注釈と欄をまとめて本文に
python -c "import pymupdf; d=pymupdf.open('F3_pymupdf.pdf'); d.bake(); d.save('G1_bake.pdf')"
# qpdf:注釈を本文に(欄は特別に扱われる)
qpdf --flatten-annotations=all F3_pymupdf.pdf G5_qpdf_flat.pdf
# qpdf:見た目を作り直してから平坦化
qpdf --generate-appearances --flatten-annotations=all F5_need_true.pdf G6_qpdf_gen.pdf
pypdf では update_page_form_field_values(..., flatten=True) のあと、remove_annotations(subtypes="/Widget") で欄を消します(pypdf のドキュメントの手順)。平坦化した各ファイルを調べた結果です。
F3_pymupdf: annots=6 fields=5 poppler抽出に山田=False MuPDF抽出に山田=True
G1_bake: annots=0 fields=0 poppler抽出に山田=False MuPDF抽出に山田=True
G2_bake_annots: annots=0 fields=0 poppler抽出に山田=False MuPDF抽出に山田=True
G4_fix_embed: annots=0 fields=0 poppler抽出に山田=True MuPDF抽出に山田=True
G5_qpdf_flat: annots=0 fields=0 poppler抽出に山田=False MuPDF抽出に山田=True
G6_qpdf_gen: annots=0 fields=0 poppler抽出に山田=False MuPDF抽出に山田=False
1平坦化しても文字化けは直らない
bake も qpdf も「今の見た目」を本文に移すだけ。見た目に日本語のフォントが埋め込まれていなければ、平坦化後も poppler では空白のままだった。
2qpdf の作り直しは日本語を「?」にする
qpdf のマニュアルに、US-ASCII などの範囲外の文字は ? に置き換わると書かれている。手元でも「?? ??」になった。
3埋め込みフォントで書き直すと両方で見える
欄の位置に日本語フォントで本文として書き、欄を消した G4 だけが、poppler と MuPDF の両方で表示・文字の取り出しができた。
pypdf の flatten のあと欄を消したファイルでは、get_fields() が TypeError: argument of type 'NullObject' is not iterable で止まりました。フォームの一覧(/Fields)に消した欄への参照が残るためで、平坦化したファイルを pypdf で読み直す処理を後に置くときは、この点に気をつけます。
提出用に平坦化するとき
平坦化は元に戻せないので、元のファイルを必ず残す
PDFに書き込んだ日本語が文字化けする原因と直し方
この節では、書き込んだ日本語が「■」「?」「・」や空白になる原因を、フォントの選び方ごとの実物で確かめ、直し方が分かります。
原因はほぼ1つで、「日本語を持たないフォント」か「埋め込まれていないフォント」で書いたことです。 同じ文字列「山田 花子 ①髙橋」を、フォントだけ変えて書き込みました。
| 書き方 | pdffonts(emb) | pdftotext の結果 | 見た目 |
|---|---|---|---|
| reportlab で Helvetica のまま | no | ■■ ■■ ①■■ | 黒い四角 |
| PyMuPDF の既定(helv) | no | ·· ·· ··· | 中黒の点 |
| 埋め込まない日本語フォント(HeiseiKakuGo-W5) | (出ない) | エラーで取り出せない | poppler では空白 |
| IPAゴシック(TrueType)を埋め込む | yes | 山田 花子 ①髙橋 | 正しい(15,349 バイト) |
埋め込まない日本語フォントは、閲覧する側に同じ種類のフォントがあれば表示されます。手元の poppler には日本語用の追加データが無く、次の原文が出て何も描かれませんでした。PyMuPDF の注釈(fontname="japan")やフォームの見た目でも同じ文言が出ています。
Syntax Error: Missing language pack for 'Adobe-Japan1' mapping
Syntax Error: Unknown font tag 'Mincho'
Syntax Error (24627): No font in show
つまり「自分のパソコンでは見えるのに、相手のパソコンやプリンターでは空白」が起こり得ます。手元でも、注釈で書いた同じファイルが MuPDF では「山田 花子」と表示され、poppler では空白でした。
reportlab で .ttc・.otf の日本語フォントが使えない
Linux に多い Noto Sans CJK(.ttc)を reportlab に登録すると、次のエラーで止まりました。
TTFError TTC file "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc": postscript outlines are not supported
ReportLab のユーザーガイド(Chapter 3: Fonts)が扱うフォントは Type 1 と TrueType の2種類で、TTFont は TrueType を読む仕組みです。手元では、PostScript(CFF)の輪郭を持つ Noto Sans CJK の .ttc がこのエラーになりました。IPAゴシック(ipag.ttf)のような TrueType のフォントを指定すると通ります。
直し方のチェックリスト
- 1日本語を含むフォントファイルを指定するHelvetica・helv など欧文の既定フォントのままにしない
- 2フォントを埋め込み、pdffonts で emb が yes か見る閲覧側のフォントに頼ると、環境によって空白になる
- 3使った文字だけを埋め込む(サブセット)PyMuPDF は subset_fonts()。名前の前に6文字が付けばサブセット
- 4フォームの見た目に頼れないときは本文に書く欄の位置に本文で書いて欄を消すと、どの描画エンジンでも同じに見えた
- 52つ以上の閲覧ソフトで開いて確かめる作ったソフトで見えても、別のソフトで見えるとは限らない
欄の位置に本文で書き直したコードです。欄の座標(wd.rect)を使うので、位置合わせが要りません。
doc = pymupdf.open("form.pdf")
page = doc[0]
for wd in list(page.widgets()):
r = wd.rect
if wd.field_name in vals:
page.insert_text((r.x0 + 6, r.y1 - 7), vals[wd.field_name], fontname="ipag", fontfile=IPA, fontsize=12)
page.delete_widget(wd) # 欄を消して本文だけにする
doc.subset_fonts()
doc.save("G4_fix_embed.pdf", garbage=4, deflate=True)
できたファイルは 81,017 バイトで、pdffonts では AJJUBT+IPAGothic Regular CID TrueType Identity-H yes yes yes と、埋め込み・サブセット・文字の対応表がすべて yes でした。文字コードそのものの化け方は、関連記事「文字化けの原因8選|濁点分離・utf8mb4・絵文字の文字数」で扱っています。グラフに日本語を書くときも同じ「フォントの指定」が原因になり、関連記事「matplotlibの使い方と日本語文字化け対策|OS別・Colab・3.12対応」で扱っています。
PDFに書き込めない理由と正規の対処(保護・スキャン画像)
この節では、PDF に書き込めないときの主な理由と、それぞれの正規の対処が分かります。保護を外す方法は扱いません。
書き込めない理由は「作成者が書き込みを制限している」「中身が画像」「閲覧ソフトが対応していない」の3つが主です。
作成者が編集・注釈を制限している
手元で、開くパスワードは無く、編集・注釈・フォーム入力を禁止した見本を qpdf で作り、--show-encryption で確かめました。
$ qpdf --show-encryption P_locked.pdf
R = 6
P = -1324
User password =
Supplied password is user password
extract for accessibility: allowed
extract for any purpose: allowed
print low resolution: allowed
print high resolution: allowed
modify document assembly: not allowed
modify forms: not allowed
modify annotations: not allowed
modify other: not allowed
modify anything: not allowed
この PDF は開けて印刷もできますが、modify annotations(注釈)と modify forms(フォーム入力)が not allowed です。PyMuPDF で読んだ権限の値でも、注釈・フォームの許可は False でした。開くのにパスワードが要る見本では、パスワードを付けずに読むと pdftotext が Command Line Error: Incorrect password で止まりました。
qpdf には、パスワードを知らなくても状態だけを確かめる --is-encrypted と --requires-password があり、終了コードで結果を返します(qpdf のヘルプの記載)。
| コマンド | 終了コード | 意味 |
|---|---|---|
--is-encrypted |
0/2 | 暗号化されている/されていない |
--requires-password |
0 | 開くのにパスワードが要る(手元の P_openpw.pdf) |
--requires-password |
3 | 暗号化はあるが開ける(手元の P_locked.pdf) |
--requires-password |
2 | 暗号化されていない |
正規の対処は次のとおりです。
- 配った人・作成者に、入力できる版を頼む:申込書なら、入力欄つきの版や Word・Excel の様式が別にあることが多い。
- パスワードを知っている作成者に、制限を変えた版を作ってもらう:自分で作った PDF なら、元のファイルから作り直す。
- 印刷して手で書き、スキャンして出す:印刷が許可されていれば、紙の手続きとして出せる。
- 相手が指定する提出方法に従う:Web フォームでの入力に切り替えている窓口もある。
中身がスキャンした画像
見本のページを 150dpi の画像にして PDF に貼り直した「スキャン風」の PDF では、文字が1つも取り出せませんでした。
text chars: 0 images: 1
search 氏名: []
annot ok
文字の検索も選択もできませんが、注釈は画像の上にも貼れます(最後の annot ok)。「テキストを追加」や描画で上から書けば提出用の書き込みはできます。中の文字を書き換えたい・検索したいときは、OCR(画像から文字を読み取る処理)を使います。Google Chrome ヘルプには、スキャンした PDF をデバイス上の OCR で検索・コピーできるようにする機能の説明があります。
閲覧ソフトがフォームの形式に対応していない
Microsoft Learn には、Edge の PDF リーダーは JavaScript を使うフォームと XFA 形式のフォームに対応していないと書かれています。欄が反応しない・計算が動かないときは、Adobe Acrobat Reader で開き直します。
よくあるエラー・つまずき(原文つき)
この節では、PDF に書き込むときに手元で出たエラーと表示を、原因と直し方の表で引けます。
| 出た文言・症状 | 原因 | 直し方 |
|---|---|---|
| Text string '山田 花子' contains characters not supported by font encoding. | pypdf で、欧文フォント(Helv)の欄に日本語を入れた | 見た目を本文に書き直すか、日本語フォントを持つ様式で作る |
| 入力欄に「?? ??」と出る | 見た目を作るフォントに日本語が無い。qpdf の作り直しも同じ | 日本語フォントを埋め込んで本文に書く |
| Missing language pack for 'Adobe-Japan1' mapping | 埋め込まない日本語フォントを、日本語データの無い環境で開いた | フォントを埋め込む(emb を yes に) |
| couldn't find a font for character U+5C71 | NeedAppearances で作り直そうとしたが日本語フォントが無い | 見た目を作ってから渡す・本文に書く |
| postscript outlines are not supported | reportlab に CFF 輪郭の .ttc・.otf を渡した | TrueType(.ttf)のフォントを使う |
| 3行書いただけで 4MB を超えた | PyMuPDF がフォント全体を埋め込んだ | doc.subset_fonts() を保存の前に呼ぶ |
| Command Line Error: Incorrect password | 開くのにパスワードが要る PDF | 作成者からパスワードか、制限の無い版をもらう |
| TypeError: argument of type 'NullObject' is not iterable | pypdf で欄を消したあと get_fields() を呼んだ | 平坦化後は欄の一覧を読まない。読むなら平坦化の前に |
| チェックボックスが「3」と表示される | ZapfDingbats を埋め込まない見た目を、そのフォントの無い環境で開いた(手元の poppler) | 平坦化するなら記号も日本語フォントで本文に書く |
- 書き込んだ位置が上下にずれる:PyMuPDF は左上、reportlab と PDF の座標は左下が原点です。A4 なら高さ 841.89pt から引きます。
- 保存したのに書き込みが消えた:「変更前のバージョン」を保存した、または書き込みを含まない元のファイルを開いている可能性があります。Chrome はダウンロード時に「変更後のバージョン」を選びます。
- 文字が欄からはみ出る:テキストボックスや欄の大きさを超えた文字は切れます。文字の大きさを下げるか、欄を広げます。
帳票として PDF を作る側の設計(項目・改ページ)は、関連記事「帳票設計書の書き方と項目一覧 帳票一覧テンプレートと改ページ」で扱っています。
よくある質問
この節では、PDF への書き込みでよく聞かれる疑問への短い答えが分かります。
Q. PDFに無料で書き込めますか?
A. 書き込めます。Windows の Edge、Mac の「プレビュー」、Android の Google ドライブ アプリ、パソコンの Chrome は OS や無料のアプリに入っている機能で、Adobe Acrobat Reader も無料で入力と署名ができます。
Q. 入力欄が無いPDFに文字を入力するには?
A. Edge の「テキストを追加」、Mac のプレビューのテキストボックス、Acrobat Reader の「入力と署名」で、好きな位置に文字を置けます。
Q. 書き込んだ文字は後から消せますか?
A. 注釈として書いたものは消せます。平坦化したもの、本文に描いたものは閲覧ソフトの普通の操作では消せません。元のファイルを残しておくのが確実です。
Q. 相手に書き換えられないようにするには?
A. 平坦化して注釈や欄を本文に焼き込みます。ただし平坦化しても、PDF を編集できるソフトを使えば書き換え自体は可能です。改ざんの検知が要るときは、証明書を使う電子署名を使います。
Q. 手書きの署名を貼れば電子署名になりますか?
A. 見た目の署名(描いた線や画像)と、証明書を使って改ざんを検知できる電子署名は別のものです。契約などで要件があるときは、相手が指定する方法に従います。
Q. オンラインの変換サイトで書き込んでもよいですか?
A. ファイルを外部のサーバーに送ることになります。個人情報や社外秘を含む書類は、パソコンやスマホの中で完結する方法(Edge・プレビュー・Acrobat Reader・自作のスクリプト)を選ぶのが安全です。
Q. スキャンしたPDFに書き込めますか?
A. 注釈(テキストの追加・描画)なら書けます。中の文字の検索や書き換えには OCR が要ります。
Q. Pythonで日本語を書き込むと「■」や「・」になります。
A. 欧文の既定フォントで書いています。日本語を含む TrueType のフォントファイルを指定して埋め込みます。
Q. pypdf と PyMuPDF はどちらを使えばよいですか?
A. 欄の値を入れて読むだけなら pypdf で用が済みます。見た目まで整える・本文に書く・平坦化する・注釈を付けるなら PyMuPDF が手軽でした。PyMuPDF は AGPL と商用のデュアルライセンスなので、配布する製品に組み込むときは公式のライセンスの説明を確かめます。
Q. 保護されたPDFの制限を外せますか?
A. この記事では扱いません。作成者に入力できる版や制限の無い版を頼むのが正規の方法です。
まとめ
- PDFに書き込む方法は「欄に入力」「テキストを追加」「描画(手書き)」「署名」の4つ。入力欄があれば欄に入力するのがいちばん崩れにくい。
- 無料なら Windows は Edge、Mac は「プレビュー」、Android は Google ドライブ、どの OS でも Acrobat Reader が使える。手順は各社の公式ヘルプで確かめた。
- 書き込みは「フォームの値」「注釈」「本文」のどこかに入る。平坦化すると注釈や欄が本文に焼き込まれ、後から消せなくなる。
- 日本語が「??」・空白・「■」になる原因は、日本語を持たないか埋め込まれていないフォント。TrueType の日本語フォントを埋め込み、
subset_fonts()で小さくする。 - 書き込めないPDFは、保護・スキャン画像・未対応の形式のどれかを確かめ、保護は作成者に頼む正規の方法で対処する。
Python の仮想環境の作り方は関連記事「uv venvとuvの使い方|仮想環境の作成・有効化とpipとの速さ比較」、画像の加工は関連記事「Python Pillowで画像処理|リサイズ・トリミング・形式変換のコード集」で扱っています。
参考・出典
いずれも確認日 2026年10月29日。
- Microsoft Learn「Microsoft Edge の PDF リーダー」:https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-pdf
- Microsoft「内蔵PDFリーダーと翻訳機能」(Microsoft Edge):https://explore.microsoft.com/ja-jp/edge/features/pdf-reader
- Google Chrome ヘルプ「Chrome で PDF を管理する」:https://support.google.com/chrome/answer/16215622?hl=ja
- Google ドライブ ヘルプ「Android でタッチペンやフリーハンドで PDF にアノテーションを付ける」:https://support.google.com/drive/answer/13207179?hl=ja
- Google ドライブ ヘルプ「Google ドライブの PDF フォームに記入する」:https://support.google.com/drive/answer/9463834?hl=ja
- Apple サポート「Macの『プレビュー』でPDFフォームに入力する/署名する」:https://support.apple.com/ja-jp/guide/preview/prvw35725/mac
- Apple サポート「iPhoneでフォームに入力する/書類に署名する/署名を作成する」:https://support.apple.com/ja-jp/guide/iphone/iph1d3607e5c/ios
- Apple サポート「iPhoneの『プレビュー』でPDFや画像に注釈を付ける」:https://support.apple.com/ja-jp/guide/iphone/iph73ca5c8e6/26/ios/26
- Adobe ヘルプ「PDF フォームへの入力と署名」:https://helpx.adobe.com/jp/reader/using/fill-and-sign.html
- Adobe ヘルプ「Acrobat モバイル版の PDF フォーム」:https://helpx.adobe.com/jp/acrobat/mobile/e-sign-documents/pdf-forms.html
- pypdf「Interactions with PDF Forms」:https://pypdf.readthedocs.io/en/stable/user/forms.html
- PyMuPDF「Document」(bake・subset_fonts):https://pymupdf.readthedocs.io/en/latest/document.html
- PyMuPDF「About」(ライセンス):https://pymupdf.readthedocs.io/en/latest/about.html
- qpdf「Running qpdf」(--flatten-annotations・--generate-appearances):https://qpdf.readthedocs.io/en/stable/cli.html
- ReportLab「ReportLab PDF Library User Guide」:https://docs.reportlab.com/reportlab/userguide/ch3_fonts/
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「PDFに書き込む方法|無料の文字入力・手書き・署名と文字化けの直し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。