2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

デザインをそのままにスライド型PDFを翻訳するツール

2
Posted at

はじめに

  • スライドを翻訳して海外のメンバーに伝えたい
  • 海外のスライドを日本語で読みたい

このような場面に遭遇したことはありませんか?

PDFを翻訳するツールは世の中にたくさんありますが、多くが「PDFの中身をテキストとして抜き出し、それを翻訳して別のファイルとして出力する」仕組みです。PDFの見栄えを保ったまま翻訳するツールは商用サービスしか見つからず、お金が掛かってしまいます。

また、そうした多くのPDFの翻訳ツールは「学術論文を読む」ことを目的としており、スライドの翻訳に最適化したツールにはなっていないようです。

プレゼンテーション資料や企業の説明スライドなど、「見た目」そのものが情報の一部を担っています。PDF化された海外カンファレンスで使ったスライドを日本語化したい、または英語版の資料を社内共有したい... そんなときに、単なるテキスト置換ではなく、PDFの見た目を崩さずに別の言語に翻訳したい、というニーズに答えるツールを作ってみました。

どんなことができるのか

このツールをひとことで言うと、「PDFの見た目を崩さずに、そのまま別の言語に翻訳してくれるツール」 です。

たとえば、英語で作られたスライド資料を日本語化したいとき、従来なら、スライド内のテキストをコピーして翻訳サイトに貼り付け、戻して位置を調整してと、かなりの手間がかかっていました。このツールなら、たった1行のコマンドで完結します。

使い方

ツールはコマンドライン(ターミナル)で動作します。
ソースコードを取得してセットアップします。curl, git などのツールはすでにインストール済みだという前提で説明を続けます。

Macでの uv の install
curl -LsSf https://astral.sh/uv/install.sh | sh
セットアップ
git clone https://github.com/aRaikoFunakami/pdf-slide-translator.git
cd pdf-slide-translator/
uv python install 3.13
uv sync
openai api を利用する準備
export OPENAI_API_KEY=<YOUR_KEY>
翻訳コマンド
# 英語のPDF「slides.pdf」を日本語に翻訳
python main.py slides.pdf -j

# 日本語のPDF「presentation.pdf」を英語に翻訳して保存名を指定
python main.py presentation.pdf -o translated_en.pdf -e

しばらく待つと、翻訳済みのPDFファイルが同じフォルダに生成されます。
中身を開くと、画像や図形はそのままに、文字だけが自然に翻訳された状態になっています。

翻訳例

Google Slide のテンプレート「合理化のためのコンサルティング提案書」の内容をPDF化し翻訳した例です。

このレベルのスライドであれば表示崩れなく翻訳されたPDFを作成することが可能です。

オリジナル 翻訳後
image.png image.png
image.png image.png
image.png image.png

編集例

翻訳した文字列はアノテーションとして描画されているので、Macのプレビューアプリなど、フリーソフトで素早く編集することも可能です。

pdf-slide-translator-annotation.gif

主な特徴とメリット

レイアウトが崩れない
テキストの位置・フォントサイズ・色などを忠実に再現します。
スライドやポスターなど、見た目が重要な資料でも安心です。但し、翻訳時に文字の長さが変わることによる文字の重なりなどは発生してしまいます。

多言語対応

様々な言語 → 日、様々な言語 → 英の方向に対応しています。
OPENAIが対応できる言語であれば簡単に拡張できます。

翻訳後の編集も自由自在
出力されたPDFはアノテーションとして翻訳テキストを重ねています。Macの「プレビュー」アプリでも簡単に位置や内容を修正できます。Acrobatなどの高価なソフトを使わなくても手直し可能です。

どんな人におすすめ?

  • 海外カンファレンスのスライドを日本語で読みたい研究者
  • 社内プレゼン資料を英語版にして共有したいビジネス担当者
  • 海外チームとのミーティングで双方向に資料を使いたいプロジェクトマネージャー
  • 教育現場で多言語教材を作成したい講師・デザイナー

つまり、「読むため」ではなく「伝えるための翻訳」を必要とするすべての人に最適です。

制限事項

現時点では OPENAI_API_KEY が必須です。

全体構造:4つのモジュールで動く

中身はどう動いているのか(技術解説)

ここからは少し技術的な話になります。
このツールが「見た目を崩さずに翻訳できる」理由は、PDFの扱い方にあります。
内部的には (1)テキストの抽出 → (2)翻訳 → (3)テキスト削除 → (4)翻訳結果の再描画 という4つのステップで構成されています。

全体構造:3つのモジュールで動く

ツールの心臓部は、以下の3つのPythonモジュールです。

  1. main.py:全体を統括する司令塔
    • コマンドライン引数を受け取り全体の処理フローを制御
    • 入力PDF・出力名・翻訳方向(多言語 → 日 or 多言語 → 英)を指定
    • 翻訳・PDF処理・キャッシュ管理を連携させるオーケストレーター
  2. translation.py:翻訳の中核
    • PyMuPDF (fitz) でPDFのテキスト構造を抽出
      • ページ → ブロック → 行 → スパンと階層的に分解し文字ごとに位置情報を記録
    • 翻訳はOpenAI API(gpt-4.1-mini)を利用
      • 多数のスパンを並列で翻訳して高速化
    • 翻訳後、元の位置・フォントサイズ・色などを再現してPDF上にFreeTextアノテーションとして重ねて描画
      • アノテーションは多くの無料アプリで編集可能
  3. pdf_text_remover.py:テキストだけをきれいに消す
    • PyMuPDF で大まかなテキストを削除した後、pikepdf でPDFの内部構造(フォーム、XObject、メタデータ)まで踏み込んでテキストを徹底的に除去する二段構え
    • 画像やベクター図形は削除しません

この設計の強み

  1. 非同期処理による高速翻訳
    通常の逐次翻訳よりも圧倒的に速く数十ページのPDFでも待ち時間を大幅短縮
  2. テキスト削除の二段構えアプローチ
    表面的な削除だけでなく、PDF構造の深層まで処理します。残存テキストを防ぎつつ、グラフィックや画像はそのまま保持します。
  3. 堅牢なキャッシュ戦略
    ファイル名ではなく内容ハッシュをキーにしているため、同じPDFなら別名でも再利用される仕組みです。

技術の裏にある工夫

工夫した部分は、「翻訳結果をPDFに戻す」部分です。
単にテキストを置き換えるのではなく、位置情報(BBox座標)とフォント属性を保持し、翻訳文を同じ位置に重ねて表示しています。この設計によって、スライド資料のようなデザイン密度の高いPDFでも見た目を保つことができるのです。

また、FreeTextアノテーションとして描画するため、出力後に軽く修正したい場合もMacのプレビューなどで簡単に編集できます。商用ソフトにありがちな“編集ロック”とは無縁です。

開発の裏側

表向きにはシンプルなPDF翻訳ツールですが、内部では技術的なトレードオフがあります。

テキスト置換の戦略:オーバーレイ方式の選択

開発初期の段階では、「PDF内部の描画命令を直接書き換える方式」も実装してみました。しかしPDFは構造が非常に複雑で、フォントや文字間隔の扱いが統一されていません。下手に書き換えると、レイアウトが崩れたり、文字が化けたりするリスクが高いようです。また、レイアウトが崩れたり文字が見えない状態になっても無料ツールでは編集できません。

そこで採用したのが、現在の「アノテーションを重ねるオーバーレイ方式」です。
元のPDFからテキストを物理的に削除し、翻訳後のテキストを同じ座標にFreeTextアノテーションとして配置します。

この方式の利点は以下の通りです:

  • 元のグラフィックや画像を壊さない
  • PDF仕様の深層に踏み込まずに安定動作
  • 修正も後から簡単にできる

もちろん、アノテーションには互換性や印刷設定の制約もありますが、スライド翻訳という目的においては最適なバランスだと考えています。

今回の方式は学術論文の翻訳には全く向いていません。
なぜなら、翻訳後の文字数の違いによるレイアウト崩れは許容し、必要に応じて無料PDF編集ソフトでササッと手直しすれば良いというポリシーで作成しているためです

テキスト削除の堅牢性

「見た目には消えているのに、検索すると元の文字が残っている」... PDFを扱う人なら一度は経験したことがあるでしょう。

この問題を回避するため、ツールでは二段構えの削除を実装しています:

  1. PyMuPDFでページ上のテキスト描画を墨消し
  2. pikepdfでフォームフィールドやXObjectなど、ページ外テキストまで徹底的に除去

この設計により、目に見えないテキストの残留を最小限に抑えています。

依存ライブラリと非同期処理の工夫

翻訳部分はOpenAIのAPIを利用しています。Gemini でも DeepL でも良いのですが、たまたま筆者が自由に利用できるのが OpenAI の API だったのが理由です。非同期でOpenAIのAPIを並列で呼び出すことで、多数のテキストスパンを並列翻訳できるようになっています。これにより、数十ページ規模のスライドでもスムーズに処理が進みます。

ローカルモデル対応

コスト削減やプライバシー保護の観点からSaaSのサービスが利用できない場合もありますので、ローカルLLMにも対応しています。次回の記事にて紹介予定です。

おわりに

このPDF翻訳ツールは、単に「翻訳する」ためのものではありません。目的は、「伝わるデザインを保ったまま、言葉の壁を越える」 ことです。

論文のように読み解くための翻訳ではなく、スライドや資料のように「見せる」ことを重視した翻訳を自動化し、誰でも手軽に扱えるようにしたのがこのツールです。

そして出力されたPDFは、Macのプレビューで簡単に微調整できるので、ちょっとした修正や追記も自由自在。まさに「仕上がった翻訳スライド」がすぐ手に入ります。

個人的に利用する範囲で問題ないレベルには仕上がりました。使ってみて、「意外と使えるかも」と感じられたので記事にしてみました。

ソースコード

今回紹介したツールのソースコードは下記のサイトで取得できます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?