業務で扱う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以降」等にすると圧縮が甘くなる)
  • 「最適化」ではなく「縮小」を使っている(「最適化」のほうが詳細に設定できる)
  • フォント埋め込みが原因でサイズが大きくなっている

対処法:

  1. 「ファイル」→「その他の形式で保存」→「最適化されたPDF」を選択
  2. 画像の圧縮設定を「150dpi」以下に変更
  3. 「フォント」タブでサブセット化されていないフォントを確認
  4. 互換性を「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付き)です。

Python PDF圧縮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)が最強
  • 圧縮は不可逆。必ず元ファイルを保管してから実行すること
📚 PDF以外の業務も自動化したい方へ

Excel処理・ファイル整理・画像圧縮など、Pythonで自動化できる業務をまとめています。

→ AI×Pythonで業務を自動化する方法まとめ

PICK UP

Fラン大卒・手取り16万から
東証プライム企業・年収500万超へ。

製造業×CAD経験で年収+200万円を実現した転職の全手順を公開中。
「自分と同じかも」と思ったら、読んでみてください。