Qiita書き方
項目書き方 実際の見え方
見出し # 見出し(#の後に半角スペース) 大きなタイトル
見出し ### 見出し(#の後に半角スペース) ちょっと大きなタイトル
太字 **強調したい文字** 強調したい文字
リスト * 項目1(*の後に半角スペース) ・項目1
リンク [表示名](URL) 表示名
引用 > 引用 文枠に囲まれた引用
コードブロック
入力:```bat:aaa.bat 個々の内容 ```
入力:```python print("Hello, Qiita!") ```
補足説明(Note)
入力: :::note info ここに補足情報を書く :::
リンクはこっちのほうがいい
空白行
リンクURL
空白行
| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This | This | This |
| column | column | column |
| will | will | will |
| be | be | be |
| left | right | center |
| aligned | aligned | aligned |
PDFを軽量化するバッチファイル
目標
会社で、とあるドマイナーCAM/CADソフトでPDFを出力する時、通常は印刷イメージをPDF出力しています。
しかしながら、印刷イメージのPDFでは拡大して確認すると大変粗くなってしまい、細かいところまでは確認できません。
これは、印刷でわかればいいような解像度の低い画像データ(ラスターデータ)になる為です。
お客様によっては大いに不満、となるわけです。
このため、ドマイナーCAM/CADソフトであっても、データのベクターデータ(ラインで構成されている物)出力のPDFを出せるようになっています。
しかし、重いデータになるととんでもなく重い。
メールで送るとかもってのほかで、開くのも時間がかかるような物ができます。
メールは5MBくらいが、送れる限界として作成します。
ということで、PDFに保存された内容を修正 → ベクターデータをラスターにしてサイズをかせぐけど、ある程度の解像度を保つことができる、といった物を
作成していきます。
今回は別部署の依頼で、自分が近くにいてパソコンの設定をするというわけにはいきません。
整える環境はとても簡素な物にします。
圧縮された1ファイルにして配布、それを開いて配置するだけで環境はととのいました、とする事を目指します。
インストールや環境変数の修正などは全部、無しという事ですね。
もちろん、全部コマンドラインの無料のフリーソフトです。
文字と軽い絵の通常のPDFは、このプログラムの場合、逆に激重のファイルになります。
構築
解凍するソフトは全て、7zFM.exeを使用します。
ImageMagickとGhostscriptを使用します。2つともに実行ファイルを直接動かす事でインストール無しにします。
ImageMagickポータブル版を使用します。ImageMagickでPDFをJPEGに変換し、PDFにします。
GhostscriptはImageMagickの中で使用されます。PDFを読む時、作成する時に内部から呼び出して使用しています。
以下のリンク
https://imagemagick.org/script/download.php
ImageMagick-7.1.2-8-portable-Q16-x64.7z をダウンロード(しょっちゅう更新されるのでそれっぽい名前のでいいと思います。)
解凍して適当なフォルダ(自分は IM)に入れます。
必要となるファイルは4つのみです。今回の目的だけなら他は消して問題ありません。
magick.exe 必須。 すべての機能の本体です。これ1つで convert, identify, mogrify 等の全機能を兼ねます。
delegates.xml 他の形式(PDFなど)を扱う際や、外部プログラムとの連携設定が入っています。
policy.xml 処理の制限(メモリ使用量やセキュリティ設定)を記述する重要なファイルです。
sRGB.icc カラープロファイル。正確な色管理(sRGBへの変換など)に必要です。
以下のリンク
https://github.com/ArtifexSoftware/ghostpdl-downloads/releases
gs10060w64.exe をダウンロード、拡張子を.zipに変更します。 7zFM.exe につっこみ、
binフォルダの内部を解凍して、imagemagickと同じフォルダに入れます。
必要となるファイルは2つのみです。今回の目的だけなら他は消して問題ありません。
gswin64c.exe コマンドライン版の本体。 ImageMagickが裏側で呼び出します。
gsdll64.dll プログラムのコアライブラリ。 Ghostscriptが動作するための心臓部。
どうしてもポータブル版が手に入らなかったのでちょっと強硬策でいってます。
はい。これで用意が整いました。
IMフォルダ、変換バッチ の2つを使用者に渡して、IMフォルダを適当な場所に置く、と
教えてください。(変換バッチ内で、IMフォルダのフルパスを指定します)
バッチは以下となります。
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
rem ---------------------------------------------------------------------------
rem 設定項目
rem ---------------------------------------------------------------------------
rem RESOLUTION: 解像度(DPI)。最低600以上を推奨。
rem QUALITY : JPEG画質(1-100)。
SET "RESOLUTION=900"
SET "QUALITY=90"
rem IM実行ファイルのパス
SET "IM_CMD=C:\IM\magick.exe"
rem ---------------------------------------------------------------------------
rem 実行準備
rem ---------------------------------------------------------------------------
if "%~1"=="" exit /b
SET "IN=%~f1"
SET "OUT=%~dp1%~n1_Lite.pdf"
SET "T_DIR=%~dp1im_tmp"
if exist "%T_DIR%" rmdir /S /Q "%T_DIR%"
mkdir "%T_DIR%"
echo Processing: %~nx1 (%RESOLUTION% DPI)
rem ---------------------------------------------------------------------------
rem Step 1: PDFから各ページをJPEG画像として書き出し
rem ---------------------------------------------------------------------------
rem -density : PDFをビットマップ化する際の密度を指定。
rem -alpha : removeとoffを併用し、透明情報を完全に破棄。背景を白にする。
rem -strip : 画像内の余計なメタデータを削除して軽量化。
rem -quality : 生成される中間画像JPEGの圧縮率。
rem p-%%04d.jpg : ページ番号を4桁(0001, 0002...)で出力。
"%IM_CMD%" -density %RESOLUTION% "%IN%" -alpha remove -alpha off -strip -quality %QUALITY% "%T_DIR%\p-%%04d.jpg"
rem ---------------------------------------------------------------------------
rem Step 2: 画像をPDFに再結合
rem ---------------------------------------------------------------------------
rem -delay 0 : 静止画PDF作成時の標準。
rem -units : PixelsPerInchを指定。解像度の計算基準を固定。
rem -density : PDF内部に「この画像はXX DPIである」と記録。
rem これによりA4等の元サイズが正しく復元される。
rem -compress : PDF内部画像をJPEG形式で保持し、ファイルサイズを削減。
"%IM_CMD%" -delay 0 -density %RESOLUTION% -units PixelsPerInch "%T_DIR%\p-*.jpg" -compress jpeg -quality %QUALITY% "%OUT%"
rem ---------------------------------------------------------------------------
rem 後処理
rem ---------------------------------------------------------------------------
rmdir /S /Q "%T_DIR%"
echo Finished.
pause
ENDLOCAL
設定1
RESOLUTION: 解像度(DPI)。最低600以上を推奨。
QUALITY : JPEG画質(1-100)。
の値をいろいろ修正して、自分の環境にあった数値を設定してください。
上の例はDPIは900にしています。
内容にもよりますが、90MBのPDFの場合、4MBほどになりました。
もちろん30KBくらいの軽い物も、4MBほどになりました。
使用場所は考えて使いましょう。
設定2
IM実行ファイルのパスは実際に使われるところにします。
今回の例は C:\IM\magick.exe で作ってます。
使い方
バッチファイルは適当な所に置けばどこでもいいです。
変更したいPDFファイルはこのバッチファイルにドラッグ&ドロップします。
AIの解説について
これと同じことをAIに聞くとほぼほぼGhostscriptを利用した圧縮を勧められます。
ベクターを使用しない、または軽くベクターを使っている物であるなら、それのほうが良いでしょう。
今回は重いベクターデータを軽くする、という特殊事情が有ります。
この場合はベクターのラスター化(線と座標の情報を絵の情報にする)しか方法はありません。
今回は、この記事を書く直前まで、Geminiに騙されるという失態があり、深く反省しました。
GeminiはImageMagickのほかにも必ずGhostscriptでの処理が必要、という理論をだして途中まで信じてしまいました。
情報は多角的に検証すべきです。
今回のPDF軽量化において、GhostscriptはImageMagickの内部処理として必要ではありますが、コマンドとしてはImageMagickだけで完結します。