【解決】PDF圧縮できない?小さくならない5つの原因と対処法
業務で扱うPDFを「もっと軽くしたい」「メールに添付できるサイズにしたい」と思って圧縮しようとしたら、なぜか圧縮できない・サイズが変わらないという経験はありませんか?
実はPDFには圧縮しやすいタイプと、圧縮が効かないタイプがあります。
これを知らないまま圧縮ツールを試しても「なぜ小さくならないのか」がわからず、時間だけが過ぎていきます。
この記事では、PDFが圧縮できない原因を5つに分解し、それぞれの対処法を解説します。Adobe Acrobatで圧縮エラーが出る場合、図面PDFが圧縮されない場合、どちらにも対応。
さらに後半では、Pythonで大量のPDFを一括圧縮するGUIスクリプトも公開しています。
【この記事で分かること】
- PDFが圧縮できない5つの原因と、それぞれの対処法
- Adobe Acrobatで圧縮エラーが出る場合の解決策
- 図面PDF(AutoCAD等)が圧縮されない理由と代替手段
- 無料で使えるPDF圧縮ツールの比較
- PythonでPDFを一括圧縮するGUIスクリプト
PDF圧縮できない原因5選(まずここを確認)
PDFが圧縮できない・サイズが小さくならない原因は、大きく5つに分けられます。
原因1:すでに圧縮済みのPDF
最もよくあるケースです。一度圧縮したPDFを再度圧縮しても、ほとんどサイズは変わりません。
PDF作成ソフト(Word→PDF変換やChromeの「印刷→PDF保存」など)が最初から圧縮設定を適用している場合、追加の圧縮は効きません。
対処法:元のファイル(Word、Excel等)から、圧縮設定を変えてPDFを再作成するのが確実です。
原因2:ベクター形式(図面PDF)で構成されている
AutoCADやJw_cadなどで作成された図面PDFは、画像ではなく「線や図形の数式データ」で構成されています。
一般的なPDF圧縮ツールは「画像の解像度を下げる」ことで圧縮しますが、ベクター形式のPDFには画像がないため、圧縮が効かない・エラーになることがあります。
実際にPythonのPyMuPDFで図面PDFを圧縮しようとした際、以下のようなエラーが出ました:
Error compressing sample_3.pdf: source or target not a PDF
対処法:Ghostscriptで再変換するか、Adobe Acrobatで「別名で保存」→構造を簡素化してから圧縮します(後述)。
原因3:Adobe Acrobatの圧縮設定が合っていない
Adobe Acrobatの「ファイルサイズを縮小」機能を使っても小さくならない場合、以下が原因であることが多いです↓
- 互換性設定が高すぎる(「Acrobat X以降」等にすると圧縮が甘くなる)
- 「最適化」ではなく「縮小」を使っている(「最適化」のほうが詳細に設定できる)
- フォント埋め込みが原因でサイズが大きくなっている
対処法:
- 「ファイル」→「その他の形式で保存」→「最適化されたPDF」を選択
- 画像の圧縮設定を「150dpi」以下に変更
- 「フォント」タブでサブセット化されていないフォントを確認
- 互換性を「Acrobat 5.0以降」に設定(古い形式ほど圧縮が効く)
原因4:セキュリティ設定(パスワード保護)がかかっている
PDFにパスワードや編集制限がかかっていると、圧縮ツールがファイルを正常に処理できないことがあります。
対処法:パスワードを解除してから圧縮してください。Adobe Acrobatなら「プロパティ」→「セキュリティ」から確認・解除できます。
原因5:PDF内に大量のメタデータ・注釈がある
コメント、マークアップ、フォーム、JavaScript、添付ファイルなどが含まれるPDFは、見た目以上にサイズが大きくなっていることがあります。
対処法:Adobe Acrobatの「最適化されたPDF」で「不要なオブジェクトを破棄」「ユーザーデータを破棄」にチェックを入れて保存します。
圧縮できるPDF vs 圧縮できないPDF(早見表)
| PDFの種類 | 圧縮しやすさ | 理由 |
|---|---|---|
| スキャンしたPDF(画像ベース) | ◎ 圧縮しやすい | 画像の解像度を下げればサイズが減る |
| Word/Excel→PDF変換 | ○ やや圧縮可能 | 画像が多ければ効く。テキスト主体だと効果薄 |
| テキスト主体のPDF | △ 効果が小さい | テキストデータはすでに軽い |
| 図面PDF(AutoCAD等) | ✕ 圧縮しにくい | ベクター形式で画像圧縮が効かない |
| 圧縮済みPDF | ✕ 圧縮できない | 再圧縮してもサイズは変わらない |
PDF圧縮のおすすめツール比較
PDFの種類に応じて、適切なツールを選ぶことが重要です。
| ツール名 | 価格 | 特徴 | おすすめ用途 |
|---|---|---|---|
| Adobe Acrobat Pro | 有料(月額) | 最も多機能。最適化設定が細かい | 業務用・全般 |
| Ghostscript | 無料 | コマンドライン。ベクター対応。高機能 | エンジニア・図面PDF |
| PDF24 Tools | 無料 | ブラウザ上で手軽。一括処理可能 | 一般用途・非機密PDF |
| Python(PyMuPDF) | 無料 | 一括処理・自動化に強い。画像ベース向き | 大量ファイルの一括圧縮 |
Ghostscriptで図面PDFを圧縮する(無料・オフライン)
ベクター形式の図面PDFにも対応したコマンドラインツールです。画質を調整しながら圧縮できます。
gswin64c -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -dQUIET -sOutputFile="output.pdf" "input.pdf"
コマンド解説
- gswin64c:Windows版 Ghostscript のコマンドライン実行ファイル(64bit)
- -sDEVICE=pdfwrite:出力デバイスをPDFに指定(PDFを新しく作り直す)
- -dCompatibilityLevel=1.4:PDF 1.4形式で出力(互換性が高い)
- -dPDFSETTINGS=/screen:低解像度プリセット(最も圧縮率が高い)。画質を優先するなら
/ebookや/printerに変更 - -dNOPAUSE -dBATCH -dQUIET:自動処理用オプション(対話なし・自動終了・ログ最小化)
PDFSETTINGSの選び方:
| 設定値 | 画質 | ファイルサイズ | 用途 |
|---|---|---|---|
| /screen | 低(72dpi相当) | 最小 | 画面表示用 |
| /ebook | 中(150dpi相当) | 小 | メール添付・社内共有 |
| /printer | 高(300dpi相当) | やや大 | 印刷用 |
| /prepress | 最高 | 大 | 入稿用 |
PDF圧縮のデメリット・注意点
PDF圧縮は便利ですが、やりすぎると逆効果になるケースもあります。
- 画質の劣化:画像の解像度を下げすぎると、文字が読めなくなったり図面の細部が潰れたりする。特に図面PDFは注意
- テキストの検索性が失われる:画像化して圧縮すると、PDF内の文字検索(Ctrl+F)ができなくなることがある
- フォントが崩れる:フォントのサブセット化や除去により、別のPC/環境で開いたときにレイアウトが変わることがある
- 元に戻せない:圧縮後のPDFから元の画質には戻せない。必ず元ファイルを保管しておくこと
おすすめの運用:圧縮は「共有用のコピー」に対して行い、原本は必ず元のサイズで保管する。特に図面や契約書は、圧縮版と原本を分けて管理するのが安全です。
PythonでPDFを一括圧縮するGUIスクリプト
ここからはエンジニア・技術者向け。
以下は、画像ベースのPDFを対象に、一括圧縮できるPythonスクリプト(Tkinter GUI付き)です。
import fitz # PyMuPDF
import os
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
def is_valid_pdf(file_path):
try:
doc = fitz.open(file_path)
doc.close()
return True
except:
return False
def compress_pdf(input_path, output_path, zoom=0.5):
try:
doc = fitz.open(input_path)
new_doc = fitz.open()
for page in doc:
pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom))
img_pdf = fitz.open("pdf", pix.tobytes())
new_doc.insert_pdf(img_pdf)
new_doc.save(output_path)
new_doc.close()
doc.close()
return True
except Exception as e:
print(f"Error compressing {input_path}: {e}")
return False
def batch_compress_pdfs(input_dir, output_dir, zoom=0.5, progress_callback=None):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
pdf_files = [f for f in os.listdir(input_dir) if f.lower().endswith(".pdf")]
total_files = len(pdf_files)
for i, filename in enumerate(pdf_files):
input_path = os.path.join(input_dir, filename)
output_path = os.path.join(output_dir, filename)
success = compress_pdf(input_path, output_path, zoom) if is_valid_pdf(input_path) else False
if progress_callback:
progress_callback(i + 1, total_files, filename, success)
def start_compression():
input_dir = input_dir_var.get()
output_dir = output_dir_var.get()
zoom = float(zoom_var.get())
if not input_dir or not output_dir:
messagebox.showerror("エラー", "入力フォルダと出力フォルダを選択してください。")
return
progress_bar["value"] = 0
progress_bar["maximum"] = 100
status_label.config(text="圧縮を開始します...")
def update_progress(current, total, filename, success):
percent = int((current / total) * 100)
progress_bar["value"] = percent
status = "✓" if success else "✗"
status_label.config(text=f"{status} {filename} ({current}/{total})")
batch_compress_pdfs(input_dir, output_dir, zoom, update_progress)
messagebox.showinfo("完了", "PDFの圧縮が完了しました。")
def browse_input_folder():
folder = filedialog.askdirectory()
if folder:
input_dir_var.set(folder)
def browse_output_folder():
folder = filedialog.askdirectory()
if folder:
output_dir_var.set(folder)
# GUI setup
root = tk.Tk()
root.title("PDF一括圧縮ツール")
input_dir_var = tk.StringVar()
output_dir_var = tk.StringVar()
zoom_var = tk.StringVar(value="0.5")
tk.Label(root, text="入力フォルダ:").grid(row=0, column=0, sticky="e")
tk.Entry(root, textvariable=input_dir_var, width=50).grid(row=0, column=1)
tk.Button(root, text="参照", command=browse_input_folder).grid(row=0, column=2)
tk.Label(root, text="出力フォルダ:").grid(row=1, column=0, sticky="e")
tk.Entry(root, textvariable=output_dir_var, width=50).grid(row=1, column=1)
tk.Button(root, text="参照", command=browse_output_folder).grid(row=1, column=2)
tk.Label(root, text="圧縮率(例: 0.5):").grid(row=2, column=0, sticky="e")
tk.Entry(root, textvariable=zoom_var, width=10).grid(row=2, column=1, sticky="w")
tk.Button(root, text="圧縮開始", command=start_compression).grid(row=3, column=1, pady=10)
progress_bar = ttk.Progressbar(root, length=400)
progress_bar.grid(row=4, column=0, columnspan=3, pady=5)
status_label = tk.Label(root, text="")
status_label.grid(row=5, column=0, columnspan=3)
root.mainloop()
使い方のポイント:
- 「圧縮率」は画像化するときのズーム倍率。0.5で約50%の圧縮が目安
- 数値を下げる → 画質は落ちるがサイズは小さくなる
- 数値を上げる → 画質は保たれるが、サイズは大きくなる
- 注意:このスクリプトは画像ベースのPDF向け。ベクター形式(図面PDF)にはGhostscriptを使ってください
「Pythonで業務効率化ツールを作りたい」と思ったら
このスクリプトのように、PythonでPDF処理・ファイル整理・画像処理などの業務ツールを自作できるようになると、仕事の生産性が一気に上がります。
Pythonで作れる業務自動化ツールの具体例をもっと知りたい方はこちら:
Python業務自動化レシピ集|現場で使える実践パターン
また、こうしたツール開発スキルがあると、ココナラで「PDF一括処理ツール作ります」「Excelレポート自動化します」といった形で副収入を得ることもできます。
ココナラでPython案件を受注するロードマップ
よくある質問(FAQ)
Q. Adobe Acrobatで「ファイルサイズを縮小」してもサイズが変わらないのはなぜ?
すでに十分に圧縮されているか、テキスト主体のPDFで画像圧縮が効かない可能性があります。「その他の形式で保存」→「最適化されたPDF」を選ぶと、画像・フォント・不要オブジェクトを個別に設定して圧縮できます。互換性を「Acrobat 5.0以降」にすると、さらに効果が出ることがあります。
Q. 無料でPDFを圧縮するならどのツールがおすすめ?
一般的な用途ならPDF24 Tools(ブラウザ上で完結)が手軽。図面PDFやベクター形式ならGhostscript。大量ファイルの一括処理ならPython(PyMuPDF)。機密性の高いPDFはオンラインツールを避け、ローカルで処理するのが安全です。
Q. 圧縮したPDFの画質を元に戻せる?
戻せません。圧縮は不可逆処理なので、必ず元ファイルを保管してから圧縮してください。特に図面・契約書は「原本」と「共有用圧縮版」を分けて管理するのが鉄則です。
Q. PythonでPDFを圧縮するメリットは?
大量ファイルの一括処理ができること。100ファイル以上のPDFを手作業で1つずつ圧縮するのは非現実的ですが、Pythonなら数分で完了します。また、スクリプトを定期実行に組み込めば、日次・週次で自動圧縮する仕組みも作れます。
まとめ
- PDFが圧縮できない原因は5つ:すでに圧縮済み / ベクター形式 / Adobe設定ミス / セキュリティ保護 / メタデータ過多
- 画像ベースのPDFは圧縮しやすいが、図面やベクター形式のPDFは通常の圧縮が効かない
- Adobe Acrobatで効かない場合は「最適化されたPDF」を使い、互換性を下げて保存
- 図面PDFはGhostscriptで再変換するのが現実的
- 大量ファイルの一括圧縮ならPython(PyMuPDF)が最強
- 圧縮は不可逆。必ず元ファイルを保管してから実行すること
あわせて読みたい
東証プライム企業・年収500万超へ。
「自分と同じかも」と思ったら、読んでみてください。

