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

    Django

    Djangoで日本語文字列のQuerySetを五十音順でソートする

    DjangoのWEBアプリケーションでQuerySetの表示順を五十音順にしたら、開発環境では五十音順で表示されているのに本番環境では五十音順になっていないときの対処法です。(中途半端に五十音順になっていて、4、5件毎に […]

    Posted on by press
    Python

    Raspberry PiにInsightFaceをインストールできなかった

    Raspberry PiにInsightFaceをインストールできなかった 顔検出や顔認証、属性判定ができるInsightFaceというライブラリを使ってRaspberry Piで属性判定に挑戦しましたが、結果的にRas […]

    Posted on by press

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

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

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