PDF を Base64 に変換する方法
- PDF を枠にドロップするか、ファイル選択で選びます。複数の PDF を同時に扱うこともできます。
- 出力形式 で形式を選びます。このページは、たいていの API が求める プレーン Base64 から始まります。
- 76 文字で折り返し にチェックを入れるのは、文字列を生の MIME メールに入れる場合だけにしてください。JSON や HTML ではオフのままにします。
- 出力をコピー を押します。大きな文書なら .txt で保存 を使うと、
yourfile.pdf.b64.txtが保存されます。
情報の行にはファイル名、サイズ、MIME タイプが、その下のカウンターにはエンコード後のサイズと増加率が表示されます。PDF はブラウザが読み込むだけでアップロードされません。ページの Content Security Policy は、Cloudflare のページビュー計測以外のネットワークリクエストを許可していません。
Base64 の PDF が使われる場面
JSON は生のバイト列を運べないので、リクエスト本文で文書を受け取るサービスは Base64 で受け取ります。電子署名サービス、請求書発行や会計のシステム、OCR や文書解析のサービス、PDF を読む AI モデルはどれもこの方式です。フィールド名は API ごとに違いますが、形はたいていファイル名、MIME タイプ、Base64 文字列です。
PDF を直接読む AI モデルも、通常は同じ方法でファイルを受け取ります。Base64 のデータとメディアタイプ application/pdf を、別々のフィールドか 1 つの Data URI で渡します。ファイルサイズやページ数に上限があることが多いので、長い文書はエンコード前に分割してください。
MIME メールの添付ファイルは、1 行最大 76 文字の Base64 です。メッセージを手で組み立てたり SMTP ライブラリをテストしたりするなら、76 文字で折り返し で、次のようなパートの本文がそのまま得られます。
Content-Type: application/pdf; name="invoice.pdf"
Content-Disposition: attachment; filename="invoice.pdf"
Content-Transfer-Encoding: base64
JVBERi0xLjcKJeLjz9MK...
JSON を受け取るメール送信 API では、添付ファイルを折り返さずにフィールドに入れます。詳しくは メールの Base64 をご覧ください。EML デコーダー を使えば、生のメッセージから添付ファイルを取り出せます。
複数の PDF をエンコードするには、一括でドロップして すべて JSON でコピー を押すと、文書ごとに {name, type, size, data} オブジェクトを 1 つ持つ配列が得られます。テスト用データベースへの初期データ投入や一括インポートに便利です。
ダウンロードリンクには HTML <a download> 出力を使います。クリックすると PDF が保存されるリンクができます。
<a href="data:application/pdf;base64,JVBERi0xLjcK..." download="invoice.pdf">invoice.pdf</a>
単一ファイルの HTML レポートで便利です。download なしで Data URI にリンクしても、たいていうまくいきません。Chrome はページが起点となるトップレベルウィンドウの data: URL への遷移をブロックするので、クリックしても何も開かないか、空白のタブが開きます。Firefox は PDF を例外として扱うため、あるブラウザでは動くリンクが別のブラウザでは動かないということが起きます。
小さな PDF を Base64 の定数として保存しておけば、ユニットテストでフィクスチャファイルを置かずにアップロードや解析の処理を試せます。
PDF の Base64 の先頭
すべての PDF は %PDF- とバージョン番号、その後の改行で始まります。Base64 ではこのヘッダーが簡単に見分けられます。
| ファイルヘッダー | Base64 |
|---|---|
%PDF-1.4 + 改行 | JVBERi0xLjQK |
%PDF-1.5 + 改行 | JVBERi0xLjUK |
%PDF-1.7 + 改行 | JVBERi0xLjcK |
%PDF-2.0 + 改行 | JVBERi0yLjAK |
出力が JVBERi0 で始まらないなら、選んだファイルは PDF ではないか、ヘッダーの前にゴミが付いています。PCFET0NUWVBF(<!DOCTYPE)や PGh0bWw(<html)で始まる文字列は HTML で、ダウンロードリンクがエラーページを .pdf という名前で保存したことを意味する場合がよくあります。
エンコードした PDF の大きさ
Base64 の出力は 3 バイトごとに 4 文字で、折り返すと 76 文字ごとに改行が 1 つ加わります。
| PDF のサイズ | Base64 の長さ | 76 文字で折り返した場合 |
|---|---|---|
| 100 KB | 136,536 文字 | 138,332 文字 |
| 1 MB | 1,398,104 文字 | 1,416,500 文字 |
| 5 MB | 6,990,508 文字 | 7,082,488 文字 |
| 10 MB | 13,981,016 文字 | 14,164,976 文字 |
| 25 MB | 34,952,536 文字 | 35,412,437 文字 |
サイズは 2 進単位(1 MB = 1,048,576 バイト)です。API のリクエストサイズの上限は、ファイルサイズではなくエンコード後のサイズと比べてください。API がマルチパートのアップロードや署名付き URL も受け付けるなら、そちらの経路なら増加分がなく、数十 MB の文書にはそのほうが向いています。サイズ計算ツール なら、どんなサイズでもこの計算をしてくれます。
このツールは大きな PDF もブラウザ内でエンコードしますが、約 48 MB を超える出力はクリップボードにコピーしません。その場合は .txt で保存 を使ってください。
コードで PDF をエンコードする
Python で JSON の本文を組み立てる場合:
import base64, json
from pathlib import Path
path = Path("invoice.pdf")
data = base64.b64encode(path.read_bytes()).decode("ascii")
body = json.dumps({"filename": path.name, "content": data})
Node.js:
import { readFile } from "node:fs/promises";
const b64 = (await readFile("invoice.pdf")).toString("base64");
const payload = JSON.stringify({ filename: "invoice.pdf", content: b64 });
GNU coreutils と jq を使ってシェルから(-w 0 で折り返しを無効化):
base64 -w 0 invoice.pdf > invoice.b64
jq -n --rawfile content invoice.b64 '{filename: "invoice.pdf", content: $content}'
filename と content のキーは仮のものです。API のドキュメントにある名前を使ってください。ほかのオプションは Python の Base64 と Node.js の Base64 にあります。
よくある問題
- API に Base64 が無効だと言われる。 最も多いのは、Base64 だけを求める API に
data:application/pdf;base64,の接頭辞を付けている場合や、-w 0なしのbase64、openssl base64(64 文字で折り返し)、76 文字で折り返し による改行が残っている場合です。URLセーフな Base64 を拒否する API もあります。 - デコードした PDF が壊れている、または空になる。 ログの行の長さ制限、短すぎるデータベースのカラム、スプレッドシートのセルなどで、文字列がどこかで切れています。上の表と長さを比べてください。PDF の最後のバイトは
%%EOFなので、完全なエンコードならデコード結果はこのマーカーで終わります。 - 自分のパソコンでは開けるのに、受信側では空白のページになる。 Base64 は文書を変えないので、問題は PDF そのものにあります。フォントの欠落、珍しい PDF のバージョン、壊れた相互参照テーブルなどです。Base64 を PDF に変換 で文字列をデコードし、結果を開いて試してください。
- Base64 は暗号化ではない。 文字列を持っている人なら誰でも文書をデコードできます。機密の PDF なら、通信経路を保護するか暗号化してください。エンコードと暗号化の違い をご覧ください。
よくある質問
PDF を JSON リクエストで送るには?
ファイルをプレーン Base64 にエンコードし、API のドキュメントにあるファイル内容のフィールドにその文字列を入れます。通常はファイル名と、MIME タイプ application/pdf と一緒に送ります。出力形式 JSON を使えば、name、type、size、data を持つオブジェクトがそのまま得られるので、それを手直ししてください。
パスワード付きの PDF も Base64 に変換できますか?
できます。Base64 はバイト列を暗号化も含めてそのままエンコードします。エンコードしたファイルも保護されたままで、デコードした人が開くにはやはりパスワードが必要です。
Base64 でエンコードされた PDF を見分けるには?
%PDF- をエンコードした JVBERi0 で始まります。続く文字はバージョンを表し、たとえば PDF 1.7 なら JVBERi0xLjc です。
Base64 の PDF リンクを開くと空白のタブになるのはなぜですか?
Chrome は、ページがトップレベルのウィンドウを data: URL に遷移させることをブロックし、ほかのブラウザも制限しています。ファイルを開くのではなく保存する HTML <a download> 出力を使うか、JavaScript で Blob URL を作ってください。
PDF は Base64 にするとどれくらいの大きさになりますか?
ファイルサイズの約 4/3 です。3 MB の PDF は約 4 MB のテキストになります。正確な値は出力の下の増加率のカウンターに表示されます。元に戻すには Base64 を PDF に変換 を使ってください。