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

    Beautiful Soupでoptionタグのvalueを取得する

    Beautiful Soupで以下のようなHTMLのoptionタグのvalueを取得する方法です。 optionタグのvalueの値を取得する方法 soup = soup.find_all('option')optio […]

    Posted on by press
    Python

    Pythonのf文字列を使った文字列の操作

    Pythonのf文字列を使った文字列の操作 Pythonのf文字列は{1}や{a}のように変数を{}(波括弧)で囲うことで、文字列の中に変数を挿入できるので直感的な記述ができるようになります。従来のように複数の変数や文字 […]

    Posted on by press

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

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

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