PythonとGhostscriptでPDFを軽量化
PythonとGhostscriptでPDFを軽量化 書類の添付などでブラウザからPDFをアップロードする際に数MB以下にしないとアップロードできないことがありますが、印刷用に作成したPDFや複数画像を一枚にまとめたPD […]
Filter by Category
PythonとGhostscriptでPDFを軽量化 書類の添付などでブラウザからPDFをアップロードする際に数MB以下にしないとアップロードできないことがありますが、印刷用に作成したPDFや複数画像を一枚にまとめたPD […]
Alembicでheadが複数存在する時に発生するエラーの修正 FastAPI, PostgreSQL, Alembicで開発中のプロジェクトで、alembic upgrade headコマンドでマイグレーションを実行し […]
Jetson NanoのWiFiモジュール取り付け手順 Jetson NanoはNVIDIA社が提供するGPUを搭載した小型かつ低電力で動作する開発用ボードです。GPUを搭載しているのでCUDAを使って画像処理などの並列 […]
2024年度 長期インターンシップについて For English page 概要 2024年度 インターンシップの募集を開始します。 募集内容 ・インターンシップ 募集職種 ・機械学習エンジニア・ウェブアプリケーション […]
Announcement about Internships for 2024 日本語のページ Overview Recruitment for the 2024 internship program is now op […]
2023年に最も読まれた記事ランキング あけましておめでとうございます2024年もどうぞよろしくお願いします ファントムは2024年も皆様のお役に立てるよう精進しますより一層のご支援、お引立てを賜りますようお願い申し上げ […]
CodePipelineでCodeBuildのテストを自動化 CodeCommitで管理しているリポジトリをCodeBuildでテストする場合は通常、手動でテストを実行させる必要がありますが、CodePipelineを使 […]
AWS CodeCommitでプルリクエスト・マージ ソースコードの管理にはGitHubやGitLabを採用している方が多いかもしれませんが、AWSにもCodeCommitというサービスがあり、5人までは無料で5人以上で […]
FastAPI + SQLAlchemy + Alembic + SQLiteでマイグレーション FastAPIにはデータベースのマイグレーション機能はありませんが、Alembicというデータベースのマイグレーションツー […]
AWS LambdaとS3、SNSでファイルのアップロードを自動通知 AWS Lambdaは特定の条件を満たすときにサーバーレスでPython(他のプログラミング言語も)を実行できるサービスです。トリガーを検知したときや […]
GitHubリポジトリを別のOrganizationに移行 非公開用のOrganization(組織)で管理していたリポジトリの公開範囲をプライベートから公開に変更するにあたって、リポジトリを別のOrganization […]
PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化 OpenCVなどで動画の処理を行う際に、1分毎の変化や10分毎に結果を見たいときに一連の動画から指定した時間毎に分割して切り出したいことがあります。 […]
OpenCVで動画ファイルの最終フレームを取得 PythonとOpenCVを使用して動画ファイルの最大フレーム数を取得する方法を解説をします。処理の確認用に取得した最大フレーム数とファイル名をソートして表示させます。 コ […]
Amazon Route 53で新規ドメインを登録 ウェブサイトやウェブサービスを運営する際にドメインは欠かせない要素です。この記事では、Amazon Route 53で新しいドメインを登録する方法について解説します。 […]
GitHub CopilotをPyCharmで使用するまでの手順 GitHub Copilotは、プログラミングの効率を飛躍的に向上させるツールで、開発者にとって非常に便利なコーディングのサポートを提供します。本記事では […]
PyCharm 2023.2から追加されたBlackによるコード成形 Pythonのコード成形で人気のBlackがPyCharm 2023.2から環境設定画面で設定可能になりました。従来はpipなどでインストールしていま […]
S3のライフサイクルルールの落とし穴 保存したデータが必要以上に増えないようにライフサイクルルールで指定した日数を経過したデータは削除する設定にしていましたが、後日改めてバケットを確認するとフォルダ、ファイルどちらも削除 […]
S3でストレージクラスを一括で変更 デフォルトではS3のストレージクラスは「標準」になっていますが、このストレージクラスは頻繁にアクセスするデータを保存するのに適した設定なので、バックアップファイルなどの頻繁にアクセスし […]
request.FILES.get(‘file’)とrequest.FILES[‘file’] の違い この記事は生成AIで作成されました request.FILES.ge […]
Twitter APIの変更に関して 最近、Twitter APIのバージョンがアップデートされ、v1が廃止されました。これに伴い、開発者はv2への移行が必要となります。 Twitter v1の廃止 Twitter v1 […]
書類の添付などでブラウザから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
初めに、PDFの軽量化に必要なGhostscriptをHomebrewでインストールします。(既にインストールされていれば飛ばします)
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やソフトウェアを開発している株式会社ファントムが運営しています。
メーリングリストに登録するとファントムの最新情報をお届けします
お客様のメールアドレスを共有することはありません