独自のPDFのQuartsフィルタを追加する

以前の日記「約1/30でも割と見られるPDFに圧縮しておく」でも試した、プレビュー.app >> ファイル >> 書き出し... のPDFのQuartsフィルタ:Reduce File Size。

ファイルの圧縮率は抜群なんだけど、細かい文字などは潰れてしまって判読不能。その時は使い物にならないと思って、諦めていた。

Reduce File Size 59KB
元画像 4.5MB

ところが、最近このPDFのQuartsフィルタを自分好みに変更する方法を知った!

PDFのQuartsフィルタの在処

  • システムが定義するすべてのQuartsフィルタは、以下のファイルパスに存在する。
$ ls -l /System/Library/Filters
total 224
−rw-r--r--  1 root  wheel  37563  9 19 17:47 Black & White.qfilter
−rw-r--r--  1 root  wheel  44455  9 19 17:47 Blue Tone.qfilter
−rw-r--r--  1 root  wheel  79369  9 19 17:47 Create Generic PDFX-3 Document.qfilter
−rw-r--r--  1 root  wheel  44475  9 19 17:47 Gray Tone.qfilter
−rw-r--r--  1 root  wheel   4772  9 19 17:47 Lightness Decrease.qfilter
−rw-r--r--  1 root  wheel   4736  9 19 17:47 Lightness Increase.qfilter
−rw-r--r--  1 root  wheel   1133  9 19 17:47 Reduce File Size.qfilter
−rw-r--r--  1 root  wheel  44480  9 19 17:47 Sepia Tone.qfilter
  • /System/Library/Filtersフォルダ内のファイル名がそのままQuartzフィルタとして表示されているのだ。


Quartzフィルタの内容

  • /System/Library/Filters/Reduce File Size.qfilterの内容を見てみると、以下のようなxmlファイルであった。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Domains</key>
	<dict>
		<key>Applications</key>
		<true/>
		<key>Printing</key>
		<true/>
	</dict>
	<key>FilterData</key>
	<dict>
		<key>ColorSettings</key>
		<dict>
			<key>DocumentColorSettings</key>
			<dict>
				<key>CustomLHSCorrection</key>
				<array>
					<integer>8</integer>
					<integer>8</integer>
					<integer>8</integer>
				</array>
			</dict>
			<key>ImageSettings</key>
			<dict>
				<key>Compression Quality</key>
				<real>0.0</real>
				<key>ImageCompression</key>
				<string>ImageJPEGCompress</string>
				<key>ImageScaleSettings</key>
				<dict>
					<key>ImageScaleFactor</key>
					<real>0.5</real>
					<key>ImageScaleInterpolate</key>
					<true/>
					<key>ImageSizeMax</key>
					<integer>512</integer>
					<key>ImageSizeMin</key>
					<integer>128</integer>
				</dict>
			</dict>
		</dict>
	</dict>
	<key>FilterType</key>
	<integer>1</integer>
	<key>Name</key>
	<string>Reduce File Size</string>
</dict>
</plist>
  • 注目すべきは、中段ImageSettings以降の部分。
  • 画像ファイルの品質を決定するであろう、いくつかの設定キーと値が見える。
Compression Quality 0.0
ImageScaleFactor 0.5
ImageSizeMax 512

独自のQuartzフィルタを作る

  • 上記のQuartsフィルタの定義ファイルをコピーして、以下のように修正してみた。
Compression Quality 0.0 JPEGの画像品質。-1から+1の範囲。-1が最低、+1が最高、0は中間。
品質が低くなるほど、ブロックノイズが増えるが、ファイルサイズは小さくなる。
ImageScaleFactor 1.0 以下のイメージサイズに対する倍率(0〜1)と思われる。1.0なら3508、0.5なら1754と解釈されるのだと思う。
ImageSizeMax 3508 PDFに保存する画像の最大サイズを指定する。
Name Reduce File Size (customize) この値がQuartzフィルタの項目として表示される。ファイル名が表示されるのではない。
  • そして、/Library/Filters/Reduce File Size (customize).qfilter として保存するのだ。
    • /Library/Filters/ は存在しなかったので、自分で追加した。
  • すると、Quartzフィルタに追加したReduce File Size (customize)が現れるのである。


ColorSyncユーティリティで編集する

  • xmlをちゃんと理解するのは難しいのだけど、/アプリケーション/ユーティリティ/ColorSyncユーティリティを起動すると、上記xmlGUIから編集できるのだ。


  • ちなみに、左下の[+]ボタンを押して「新規追加」したり、右側の▼ボタンを押して「フィルタを複製」できるのだけど、保存先は$HOME/Library/Filters/ 以下になる。
  • ところが、$HOME/Library/Filters/ のQuartzフィルタは、プレビュー.appには表示されないのだ...。(残念。不具合か?)
  • 起動ディスク直下の /Library/Filters/ のQuartzフィルタは、ちゃんとプレビュー.appに表示された。

設定方法を探る

イメージのサンプリング >> ピクセルで指定する
  • なぜ「イメージのサンプリング」の「最大:3508ピクセル」にしたかと言えば...
    • A4サイズの長辺の長さ297mm。(自分の環境では、ほとんどのPDFがA4サイズ以下なので)
    • インチサイズに変換して、297÷25.4=11.69291338582677インチ。
    • Retinaディスプレイの由来から300dpiの解像度があれば十分なので、11.69291338582677×300=3507.874015748031≒3508ピクセル
  • 以上の計算から、サイズ調整:100%、最大:3508ピクセルに設定しておけば、A4サイズまでの環境なら300dpiがキープできることになるのだ。
イメージのサンプリング >> 解像度で指定する
  • 気になる項目は「解像度」である。これを設定すると、xmlキーは「ImageResolution」となる。
  • 元の Reduse File Size の設定にはない項目である。(上記のピクセル指定で設定されているので)
  • いろいろ試してみると、実は300dpiの解像度が欲しいのであれば、「解像度:300ピクセル/インチ」と指定するだけでOKだった。
  • 但し、解像度を指定する場合は、その他の項目はすべて0にしておく必要がある。(0にすると空欄となる)

  • ピクセル指定のような面倒な計算は不要だったのである。
イメージの圧縮 >> 品質
  • JPEG品質によって、ファイルサイズと画像品質にどのような影響があるか調べてみた。
品質 サイズ 画像
元画像 32.6MB 目視でJPEG品質+1と同じ
+1(最大) 21.6MB(元画像の2/3)
0 2.2MB(元画像の1/15)
-0.2 1.6MB(元画像の1/20) 目視でJPEG品質0と同じ
-1(最小) 900KB(元画像の1/36)
  • 元画像とJPEG品質+1(最大)の差は、目視では判別できないレベルだった。(容量の無駄なので元画像はなし)
  • JPEG品質0は、目視でブロックノイズが若干確認できるのだが、拡大しないと気付かないレベル。
    • このページでは1/2縮小表示しているので、ほとんど気付けないレベルになってしまっている。(クリックして原画を見ると若干のブロックノイズあり)
  • JPEG品質-0.2は、JPEG品質0とほとんど同じ。
  • JPEG品質-1は、ブロックノイズが明確に確認できる。
    • 但し、画像の美しさを追求しなければ、この品質でも十分かもしれない。
    • 解像度は300dpiあるので、小さな文字でもちゃんと判読できる。


以上の結果から...

  • 解像度は300dpi。(Retina環境を考慮して)
  • 品質重視なら、JPEG品質=-0.2。
  • 圧縮重視なら、JPEG品質=-1。


品質重視のこの設定でしばらく使ってみる!(1/20)


イメージのサンプリング >> 品質について

  • この項目のxmlのキーは、ImageScaleInterpolate(イメージ補完?)となっている。
  • システムデフォルトの設定では、となっているのだけど、
  • ColorSyncユーティリティでは、高・中・低を選択して、1・2・3が書き込まれる。
  • 果たしてどちらの設定が正しいのか不明だが、どのような値を設定しても画像サイズ・品質とも違いはなかった。
    • (別の特定の条件で何らかの影響を与えるのかもしれないが)