Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2010-12-03

[][][][]InDesignから書き出されたPDFは、InDesignの操作履歴をもっている。時には大量に。

ExifToolを触っていたらへんなことに気がついてしまった。InDesignから書き出されたPDFは、XMPの中にInDesignの操作履歴をもってるみたい。

$ exiftool A.pdf
ExifTool Version Number         : 7.52
File Name                       : A.pdf
Directory                       : .
File Size                       : 422 kB
File Modification Date/Time     : 2010:12:03 11:26:54+09:00
File Type                       : PDF
MIME Type                       : application/pdf
PDF Version                     : 1.3
XMP Toolkit                     : Image::ExifTool 7.52
Format                          : application/pdf
Doc Change Count                : 107
Creator Tool                    : Adobe InDesign CS5_J (7.0.3)
Metadata Date                   : 2010:12:03 11:19:16+09:00
Document ID                     : xmp.did:FD7F117407206811A961D08B23C087A9
History Action                  : created, saved, saved, saved, saved, saved, saved, saved, saved, saved, saved, saved, saved, saved, saved
History Instance ID             : xmp.iid:FD7F117407206811A961D08B23C087A9, xmp.iid:FE7F117407206811A961D08B23C087A9, xmp.iid:FF7F117407206811A961D08B23C087A9, xmp.iid:0080117407206811A961D08B23C087A9, xmp.iid:27CA6B9219206811A961D08B23C087A9, xmp.iid:28CA6B9219206811A961D08B23C087A9, xmp.iid:2FCA6B9219206811A961D08B23C087A9, xmp.iid:30CA6B9219206811A961D08B23C087A9, xmp.iid:086F72D11A206811A961D08B23C087A9, xmp.iid:FC7F1174072068118C14F973A1F0976C, xmp.iid:FD7F1174072068118C14F973A1F0976C, xmp.iid:FE7F1174072068118C14F973A1F0976C, xmp.iid:FF7F1174072068118C14F973A1F0976C, xmp.iid:00801174072068118C14F973A1F0976C, xmp.iid:B4A18584072068118C14F973A1F0976C
History Software Agent          : Adobe InDesign 6.0, Adobe InDesign 6.0, Adobe InDesign 6.0, Adobe InDesign 6.0, Adobe InDesign 6.0, Adobe InDesign 6.0, Adobe InDesign 6.0, Adobe InDesign 6.0, Adobe InDesign 6.0, Adobe InDesign 7.0, Adobe InDesign 7.0, Adobe InDesign 7.0, Adobe InDesign 7.0, Adobe InDesign 7.0, Adobe InDesign 7.0
History When                    : 2010:07:03 15:08:01+09:00, 2010:07:03 15:08:49+09:00, 2010:07:03 15:08:49+09:00, 2010:07:03 15:15:34+09:00, 2010:07:03 15:21:50+09:00, 2010:07:03 15:22:03+09:00, 2010:07:03 15:28:18+09:00, 2010:07:03 15:28:43+09:00, 2010:07:03 15:29:51+09:00, 2010:12:03 11:18:39+09:00, 2010:12:03 11:18:39+09:00, 2010:12:03 11:18:41+09:00, 2010:12:03 11:18:43+09:00, 2010:12:03 11:18:46+09:00, 2010:12:03 11:18:47+09:00
History Changed                 : /, /metadata, /, /, /, /, /, /, /;/metadata, /metadata, /;/metadata, /;/metadata, /;/metadata, /;/metadata
Instance ID                     : uuid:6288af79-e6ab-d343-8d4f-cbd97649a750
Original Document ID            : xmp.did:FD7F117407206811A961D08B23C087A9
Rendition Class                 : proof:pdf
Version ID                      : 1
Page Count                      : 20
Create Date                     : 2010:12:03 11:19:15+09:00
Creator                         : Adobe InDesign CS5_J (7.0.3)
GTS PDFX Conformance            : PDF/X-1a:2001
GTS PDFX Version                : PDF/X-1:2001
Modify Date                     : 2010:12:03 11:19:16+09:00
Producer                        : Adobe PDF Library 9.9
Title                           : A
Trapped                         : False

「History Action」「History Instance ID」「History Software Agent」「History When」「History Changed」などの項目だ。これらはBridgeからも参照できる。

f:id:seuzo:20101203115209p:image

まあ、この程度だったらまあ許せる範囲なんだけど、操作履歴だからこれがものすごくたくさん残っていることがある。この部分だけで何十KBにもなることがある。あれ、バイナリ開いちゃった? くらいの勢いになる。なぜPDFがInDesignのヒストリを持っている必要があるのかはわからない。「PDFよ、何故親の過去を背負う?」。まあ消しちゃっていいかな? いいとも! ということで消してみました。

# coding: utf-8
#require 'rubygems'
require 'mini_exiftool'

ARGV.each do |my_file|
	tmp_f = MiniExiftool.new(my_file)
	tmp_f['HistoryAction'] = ''
	tmp_f['HistoryChanged'] = ''
	tmp_f['HistoryInstanceID'] = ''
	tmp_f['HistorySoftwareAgent'] = ''
	tmp_f['HistoryWhen'] = ''
	tmp_f.save
end

(追記:2010-12-03T13:00:53+0900)@pictexさんにもご指摘いただきましたが、Rubyを使わなくてもAcrobat Proの最適化を使えば、ユーザーのメタデータは破棄できます。「ユーザーデータの破棄」-「文書情報とメタデータを破棄」です。バッチ処理にも組み込めます。ただし、特定の要素だけを破棄(変更)するには上記のような方法も有効です。

2010-11-08

[]Exifで解像度(ppi)を変更する

解像度を変更するには、基本的にPhotoshopを使います。しかし、画像の再サンプル(やリサイズ)をしないなら、Exifを書き換えるだけで解像度(ppi)を変更できます*1。コマンドラインなどから変更できれば、画像のバッチ処理などにいろいろ応用できるでしょう。

使用したのは「ExifTool」です。以前にこちらでもちょっと紹介しました。

実際にこの画像を使ってやってみました。

f:id:seuzo:20101108135915j:image

Photoshop上で確認すると72ppiになっています。

f:id:seuzo:20101108135916p:image

ExifToolでExifを確認してみます。

$ exiftool 001.jpg 
ExifTool Version Number         : 7.52
File Name                       : 001.jpg
Directory                       : .
File Size                       : 64 kB
File Modification Date/Time     : 2010:07:28 15:55:06+09:00
File Type                       : JPEG
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
Image Description               : Back Camera
Make                            : Apple
Camera Model Name               : iPhone
Orientation                     : Horizontal (normal)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Software                        : 4.0.1
Modify Date                     : 2010:07:28 15:34:28
Y Cb Cr Positioning             : Centered
Exposure Time                   : 1/15
F Number                        : 2.4
Exposure Program                : Program AE
ISO                             : 400
Exif Version                    : 0221
Date/Time Original              : 2010:07:28 15:34:28
Create Date                     : 2010:07:28 15:34:28
Shutter Speed Value             : 1/15
Aperture Value                  : 2.4
Metering Mode                   : Average
Flash                           : Auto, Did not fire
Focal Length                    : 3.9 mm
Subject Location                : 1295 967 699 696
Flashpix Version                : 0100
Color Space                     : sRGB
Exif Image Width                : 640
Exif Image Height               : 478
Sensing Method                  : One-chip color area
Exposure Mode                   : Auto
White Balance                   : Auto
Scene Capture Type              : Standard
Sharpness                       : Hard
Image Width                     : 464
Image Height                    : 640
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Aperture                        : 2.4
Image Size                      : 464x640
Shutter Speed                   : 1/15
Focal Length                    : 3.9 mm
Light Value                     : 4.4

この状態で、ExifToolから解像度を変更します。念のため、Resolution Unitも指定しておきましょう。*2

$ exiftool -XResolution="350" -YResolution="350" -resolutionunit=inches 001.jpg

Photoshop上で確認すると350ppiになっています。

f:id:seuzo:20101108142603p:image

ExifToolでも確認してみます。

$ exiftool -s -XResolution -YResolution -resolutionunit 001.jpg 
XResolution                     : 350
YResolution                     : 350
ResolutionUnit                  : inches

InDesign上に配置した際も正しく認識しています。

f:id:seuzo:20101108142604p:image


Exif情報がない画像にExifを追加した場合

画像のExif情報をすべて廃棄するには

$ exiftool -overwrite_original -all= 001.jpg

とします*3。exiftoolでは、画像情報から読み取れるものを生成してしまいますが、Exif Viewer :: Add-ons for Firefoxなどを使用すれば、Exif情報がなくなっているのを確認できます。

f:id:seuzo:20101108142605p:image

Photoshop上で確認すると、解像度は72ppiに戻っています。

f:id:seuzo:20101108152702p:image

Exif情報がない状態で再度解像度を変更してみます。

$ exiftool -XResolution="350" -YResolution="350" -resolutionunit=inches 001.jpg
    1 image files updated
$ exiftool 001.jpg
ExifTool Version Number         : 7.52
File Name                       : 001.jpg
Directory                       : .
File Size                       : 63 kB
File Modification Date/Time     : 2010:11:08 15:28:21+09:00
File Type                       : JPEG
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
X Resolution                    : 350
Y Resolution                    : 350
Resolution Unit                 : inches
Y Cb Cr Positioning             : Centered
Image Width                     : 464
Image Height                    : 640
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 464x640

Photoshop上で確認すると、指定通りに350ppiになっています。

f:id:seuzo:20101108152703p:image


Photoshop形式(psd)ファイルは内部に解像度を保持している

Photoshop形式(psd)ファイルは内部に解像度を保持しているようです。ためしに350ppiの画像を保存して、Exifを削除し、解像度を書き換える実験を行います。

「002.psd」はPhotoshop上で見ると350ppiを持っています。

f:id:seuzo:20101108174353p:image

まだこの状態では、Exif情報とPhotoshop上の解像度は一致しています。

$ exiftool 002.psd
ExifTool Version Number         : 7.52
File Name                       : 002.psd
Directory                       : .
File Size                       : 883 kB
File Modification Date/Time     : 2010:11:08 15:32:52+09:00
File Type                       : PSD
MIME Type                       : application/photoshop
Num Channels                    : 3
Image Height                    : 640
Image Width                     : 464
Bit Depth                       : 8
Current IPTC Digest             : cdcffa7da8c7be09057076aeaf05c34e
Coded Character Set             : UTF8
Application Record Version      : 0
IPTC Digest                     : cdcffa7da8c7be09057076aeaf05c34e
XMP Toolkit                     : Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00
Already Applied                 : True
Color Mode                      : 3
Create Date                     : 2010:11:08 15:28:21+09:00
Metadata Date                   : 2010:11:08 15:32:52+09:00
Format                          : application/vnd.adobe.photoshop
Instance ID                     : xmp.iid:FC7F117407206811ACAF8E98728B9279
Document ID                     : xmp.did:FB7F117407206811ACAF8E98728B9279
Original Document ID            : xmp.did:FB7F117407206811ACAF8E98728B9279
History Action                  : saved, converted, derived, saved
History Instance ID             : xmp.iid:FB7F117407206811ACAF8E98728B9279, xmp.iid:FC7F117407206811ACAF8E98728B9279
History When                    : 2010:11:08 15:32:52+09:00, 2010:11:08 15:32:52+09:00
History Software Agent          : Adobe Photoshop CS5 Macintosh, Adobe Photoshop CS5 Macintosh
History Changed                 : /, /
History Parameters              : from image/jpeg to application/vnd.adobe.photoshop, converted from image/jpeg to application/vnd.adobe.photoshop
Derived From Instance ID        : xmp.iid:FB7F117407206811ACAF8E98728B9279
Derived From Document ID        : xmp.did:FB7F117407206811ACAF8E98728B9279
Derived From Original Document ID: xmp.did:FB7F117407206811ACAF8E98728B9279
X Resolution                    : 350
Displayed Units X               : inches
Y Resolution                    : 350
Displayed Units Y               : inches
Global Angle                    : 30
Global Altitude                 : 30
Photoshop Thumbnail             : (Binary data 4497 bytes, use -b option to extract)
Exif Byte Order                 : Big-endian (Motorola, MM)
Bits Per Sample                 : 8 8 8
Photometric Interpretation      : RGB
Orientation                     : Horizontal (normal)
Samples Per Pixel               : 3
Resolution Unit                 : inches
Software                        : Adobe Photoshop CS5 Macintosh
Modify Date                     : 2010:11:08 15:32:52
Y Cb Cr Positioning             : Centered
Exif Version                    : 0221
Color Space                     : Uncalibrated
Exif Image Width                : 464
Exif Image Height               : 640
Compression                     : JPEG (old-style)
Thumbnail Offset                : 394
Thumbnail Length                : 0
Image Size                      : 464x640

ExiftoolでExif情報を削除してみます。

$ exiftool -all= 002.psd
    1 image files updated
$ exiftool 002.psd
ExifTool Version Number         : 7.52
File Name                       : 002.psd
Directory                       : .
File Size                       : 868 kB
File Modification Date/Time     : 2010:11:08 17:48:48+09:00
File Type                       : PSD
MIME Type                       : application/photoshop
Num Channels                    : 3
Image Height                    : 640
Image Width                     : 464
Bit Depth                       : 8
Color Mode                      : RGB
IPTC Digest                     : cdcffa7da8c7be09057076aeaf05c34e
Global Angle                    : 30
Global Altitude                 : 30
Photoshop Thumbnail             : (Binary data 4497 bytes, use -b option to extract)
Image Size                      : 464x640

このファイルをPhotoshopで開くと350ppiを保持しつづけています。

f:id:seuzo:20101108174354p:image

ちなみにPhotoshopの「ファイル情報...」を開くとこんな感じになっています。

f:id:seuzo:20101108174355p:image

このファイルのExif情報に解像度を追加します。

$ exiftool -XResolution="72" -YResolution="72" -resolutionunit=inches 002.psd
    1 image files updated

$ exiftool 002.psd
ExifTool Version Number         : 7.52
File Name                       : 002.psd
Directory                       : .
File Size                       : 868 kB
File Modification Date/Time     : 2010:11:08 17:55:55+09:00
File Type                       : PSD
MIME Type                       : application/photoshop
Num Channels                    : 3
Image Height                    : 640
Image Width                     : 464
Bit Depth                       : 8
Color Mode                      : RGB
IPTC Digest                     : cdcffa7da8c7be09057076aeaf05c34e
Global Angle                    : 30
Global Altitude                 : 30
Photoshop Thumbnail             : (Binary data 4497 bytes, use -b option to extract)
Exif Byte Order                 : Big-endian (Motorola, MM)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Y Cb Cr Positioning             : Centered
Image Size                      : 464x640

Exifが書き換わりました。実際のファイル:002.psd.zip 直

さあ、Photoshopで開いてみましょう。

f:id:seuzo:20101108174356p:image

Photoshop上では350ppiを保持したままです。かつ、ファイル情報は72ppiに書き換わっています。

f:id:seuzo:20101108174357p:image

このファイルをInDesignに貼り込んだらどうなるでしょう? こうなります。

f:id:seuzo:20101108174358p:image

InDesignExif情報を見て画像の解像度を決めているようです(あるいはExifを優先していると考えられます)。PSプリンタに出してみましたが、画面のとおりのレイアウトが保たれました。

*1:ただし、(後述するように)個々のフォーマット内部で保持している解像度とExif値が異なるような場合、アプリケーションがどちらを利用するかについては判断できていません。以下は限られたフォーマットと特定のアプリケーションでの実験です。結果を保証できるものではありません。

*2:ちなみに、デフォルトではバックアップファイルが出来るので、すでにバックアップがあるのなら「-overwrite_original」オプションを追加すればいいでしょう。

*3:この方法は一括でExif情報を削除する有効な方法です。

2010-10-04

[][][]PDFのメタデータを書き換える

Acrobatの「プロパティ」を開いた時、こんなことになっているPDFを見たことはないだろうか。

f:id:seuzo:20101004201415p:image

ああ、ファイル名はちゃんとしてるのに、「タイトル:」欄が昔の名前ででています… このままだと、ちょっと恥ずかしいって時、PDFのメタデータをファイル名で一括置換するようにします。

# coding: utf-8
#Exifに含まれるタイトルをファイル名に置き換える。
#require 'rubygems'
require 'mini_exiftool'

ARGV.each do |my_file|
	tmp_f = MiniExiftool.new(my_file)
	tmp_f['Title'] = my_file.sub(/\.pdf/, '')
	tmp_f.save
end

mini_exiftool」を使いました。「ruby script.rb *.pdf」みたいに使ってください。

f:id:seuzo:20101004202322p:image

2008-11-09

[][][][]XMPEXIFrubyで読み書きする

妄想をしていても仕方ないんで、いまあるものでXMPEXIFを読み書きしてみたい。rubyから使えたら便利っぽい。予習にもなる(かもしれない)メモ。

google:ruby xmpでぐぐるとChilkat Ruby XMP Libraryなんてのに行き着くけれど、$289の売り物っぽいので、遊び用途には向かない。RAAで検索したら、

にヒットしました。なかなかよさげ。これ、要するに

っていうコマンドラインアプリケーションのラッパーになっている風。さっそくExifToolからインストールしてみる。Mac OS X用のパッケージとインストール方法が記されている。ライセンスはperlライセンス。

インストールといっても、ダウンロードしたパッケージをダブルクリックするだけ。あー便利な世の中。

/usr/binにlibディレクトリが作られていて、ちょっといやんな感じ。中を覗くとperl用モジュールっぽい。アンインストールするときは、この「/usr/bin/lib/」と「/usr/bin/exiftool」(本体)を削除すればいいのね。

$ exiftool --help

とすると長々とヘルプが現れる(たいていこんな感じ)。

ExifToolでの読み書き

ためしにPhotoshopのサンプル画像「アイランドガール.jpg」(island_girl.jpgにリネームした)のexif情報を表示してみよう。

$ exiftool island_girl.jpg 

とするだけで以下の情報が出力された。

ExifTool Version Number         : 7.52
File Name                       : island_girl.jpg
Directory                       : .
File Size                       : 1223 kB
File Modification Date/Time     : 2007:10:29 02:16:08+09:00
File Type                       : JPEG
MIME Type                       : image/jpeg
Exif Byte Order                 : Little-endian (Intel, II)
Image Description               : I think I'll go canoeing
Orientation                     : Horizontal (normal)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Y Cb Cr Positioning             : Co-sited
Exposure Time                   : 1/400
F Number                        : 7.1
Exposure Program                : Program AE
ISO                             : 100
Exif Version                    : 0210
Date/Time Original              : 2002:12:16 14:20:56
Create Date                     : 2002:12:16 14:20:56
Components Configuration        : YCbCr
Compressed Bits Per Pixel       : 2
Exposure Compensation           : 0
Max Aperture Value              : 2.8
Metering Mode                   : Multi-segment
Light Source                    : Unknown
Flash                           : No Flash
Focal Length                    : 13.6 mm
Warning                         : Invalid PrintIM header
Flashpix Version                : 0100
Color Space                     : sRGB
Exif Image Width                : 2048
Exif Image Height               : 1536
Interoperability Index          : R98 - DCF basic file (sRGB)
Interoperability Version        : 0100
File Source                     : Digital Camera
Scene Type                      : Directly photographed
Compression                     : JPEG (old-style)
Make                            : SONY
Camera Model Name               : CYBERSHOT
Modify Date                     : 2002:12:16 14:20:56
Thumbnail Offset                : 856
Thumbnail Length                : 3648
Image Width                     : 2048
Image Height                    : 1536
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:2 (2 1)
Aperture                        : 7.1
Image Size                      : 2048x1536
Shutter Speed                   : 1/400
Thumbnail Image                 : (Binary data 3648 bytes, use -b option to extract)
Focal Length                    : 13.6 mm
Light Value                     : 14.3

特定の情報だけを得るにはどうしたらいいか。カメラメーカー名だけを得たければ、

$ exiftool -s -Make island_girl.jpg

とすれば、

Make                            : SONY

と出力される。モデルの「値だけ」を得たければ、

$ exiftool -s -s -s  -Model island_girl.jpg

とすれば、(「Camera Model Name」タグが「CameraModelName」ではなくて「Model」と略されるのか不明だけど)

CYBERSHOT

と出力される。「-s -s」がスペーシングをなくし、「-s -s -s」で値だけという意味みたい。

では、今度はEXIF情報を書き込んでみる。緯度と経度を書き込むには

$ exiftool -GPSLatitude="35.684675" -GPSLongitude="139.755495" -GPSLatitudeRef="North" -GPSLongitudeRef="East" island_girl.jpg 

こんな感じか。Photoshopで確認すると、確かに書き込まれている。ちなみに、上記のコマンドを実行すると、勝手にオリジナルファイル(island_girl.jpg_original)が作成されるが、不要な場合は-overwrite_originalオプションをつけるといい。

f:id:seuzo:20081108173353p:image

mini_exiftoolの読み書き

さて、ようやく本丸。というか、たぶん、exiftoolそのものはPerlでの使用を前提としているみたい。Ruby厨ってわけじゃないけれど、なにかと便利な場面があるかもしれないってことで。さっそくインストール。READMEに書いてある通りなんだけど、

$sudo gem install mini_exiftool

とするだけ。あとはTutorialの引き写しだけれど、撮影日を得たいなら

require 'rubygems'
require 'mini_exiftool'

photo = MiniExiftool.new 'island_girl.jpg'
puts photo['DateTimeOriginal']

とすればいい。結果は

Mon Dec 16 14:20:56 +0900 2002

こんどは「island'」「girl」「sea」って3つのキーワードを追加してみる。

require 'rubygems'
require 'mini_exiftool'

photo = MiniExiftool.new 'island_girl.jpg'
photo.keywords = ['island', 'girl', 'sea']
photo.save

f:id:seuzo:20081109003257p:image

なぜかわからないけれど、日本語が通らない。なんらかの処理が必要なんだろうか。謎。

AppleScriptで読み書きする

ちょっと見つけたので、参考までに追記。Image Eventsを使う方法。

Extracting Metadata

AppleScript & EXIF data