PythonとGhostscriptでPDFを軽量化


press
PythonとGhostscriptでPDFを軽量化

PythonとGhostscriptでPDFを軽量化

書類の添付などでブラウザからPDFをアップロードする際に数MB以下にしないとアップロードできないことがありますが、印刷用に作成したPDFや複数画像を一枚にまとめたPDFは容量が大きくなりがちで、数十MBを超えてしまうことも少なくなりません。PDFを軽量化するオンラインサービスではセキュリティが心配なので、本記事ではPythonとGhostscriptを使ってローカル環境でPDFを軽量化する方法を解説します。

コードはGitHubリポジトリにあげています。

開発環境

PC: MacBook Pro (14, 2021)
OS: macOS Monterey 12.6.7
Python: 3.11.6
Ghostscript: 10.03.1

Ghostscriptのインストール

初めに、PDFの軽量化に必要なGhostscriptをHomebrewでインストールします。(既にインストールされていれば飛ばします)

PDF軽量化のコード

comp.py

import argparse
import subprocess

output_pdf_path = "outputs/compress.pdf"


def compress_pdf(input_pdf_path, quality):
    quality_settings = {
        'screen': '72',
        'ebook': '150',
        'printer': '300',
        'prepress': '300',
        'default': '300'
    }

    if quality not in quality_settings:
        quality = 'default'

    ghostscript_command = [
        'gs', '-sDEVICE=pdfwrite', '-dCompatibilityLevel=1.4',
        '-dPDFSETTINGS=/{}/'.format(quality), '-dNOPAUSE', '-dQUIET',
        '-dBATCH', '-sOutputFile={}'.format(output_pdf_path),
        input_pdf_path
    ]

    subprocess.run(ghostscript_command)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Compress a PDF using Ghostscript')
    parser.add_argument('input_pdf_path', help='Path to the input PDF')
    parser.add_argument('quality', help='Quality of the PDF compression (screen, ebook, printer, prepress, default)')

    args = parser.parse_args()

    compress_pdf(args.input_pdf_path, args.quality)

実行方法

下記の引数を指定してコマンドを実行します。

コマンド実行後、output_pdf_pathで指定したディレクトリにcompress.pdfという名前で軽量化したPDFが出力されます。

python comp.py /path/to/your/input.pdf ebook

/path/to/your/input.pdf:軽量化するPDFのパスを指定

ebook:出力するクオリティを指定

解説

import argparse
import subprocess

モジュールのインポート

output_pdf_path = "outputs/compress.pdf"

軽量化したPDFの出力先のパスを指定

quality_settings = {
    'screen': '72',
    'ebook': '150',
    'printer': '300',
    'prepress': '300',
    'default': '300'
}

出力するクオリティに対応する値を辞書として定義
Ghostscriptのオプションの値として使用

if quality not in quality_settings:
    quality = 'default'

指定したクオリティがquality_settingsの辞書になければdefaultに設定

ghostscript_command = [
    'gs', '-sDEVICE=pdfwrite', '-dCompatibilityLevel=1.4',
    '-dPDFSETTINGS=/{}/'.format(quality), '-dNOPAUSE', '-dQUIET',
    '-dBATCH', '-sOutputFile={}'.format(output_pdf_path),
    input_pdf_path
]

Ghostscriptを実行するためのコマンドラインを作成

subprocess.run(ghostscript_command)

コマンドラインを実行するコード

parser = argparse.ArgumentParser(description='Compress a PDF using Ghostscript')
parser.add_argument('input_pdf_path', help='Path to the input PDF')
parser.add_argument('quality', help='Quality of the PDF compression (screen, ebook, printer, prepress, default)')

args = parser.parse_args()

軽量化するPDFのパスとクオリティを引数に設定

compress_pdf(args.input_pdf_path, args.quality)

PDFを軽量化するcompress_pdf関数を呼び出すコード


株式会社ファントムへのお問い合わせ

群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。




    Related Articles

    Python

    PyCharm&DockerでもBlackでコードフォーマット

    PyCharm&DockerでもBlackでコードフォーマット venvなどで環境構築されたプロジェクトであれば、PyCharmのFile Wacherというプラグインでファイルの保存時にBlackによるコードの […]

    Posted on by press
    Python

    複数の画像からgifアニメーションを作る

    複数の画像からgifアニメーションを作る 定点撮影などで連番になっている複数の画像をまとめてgifアニメーションに変換する方法です。 コードはGitHubリポジトリにあげています。 コード 結果 解説 import gl […]

    Posted on by press

    最新情報をお届けします!

    メーリングリストに登録するとファントムの最新情報をお届けします

    お客様のメールアドレスを共有することはありません