Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2011-10-17

[][]Adobe Reader for iPhone (and iPad)

iPhoneiPad向けのAdobe純正のPDFビューア「Adobe Reader」が配布されています。

[?] Adobe Reader - iTunes App Store で Adobe Reader をダウンロード

f:id:seuzo:20111017155821p:image


早速iPhone4(iOS5)入れてみました。ファーストリリースなので、いろいろ不具合もあるかもしれませんが、とりあえず第一印象は...

GoodReaderなどに比べてて描画遅いような気がします。

HTMLリンクや手動のリンクも効かないようです。JavaScriptも無視されています。テキスト検索も遅いです(5ページ1000文字程度)。何度かテキスト検索をしていたら、フリーズしてしまいました^^

埋め込まれた注釈は読めるようです。

f:id:seuzo:20111017155819p:image

閲覧時にパスワード制限のかかっているPDFも、パスワード入力で読めました。

f:id:seuzo:20111017155820p:image

2010-12-06

[][][]Acrobat9.4.1でセキュリティを変更したPDFはAppleScriptからの保存に失敗する

Acrobat9.4以前では、なんの問題もなく動いていたスクリプトが、Acrobat9.4.1にアップデートした途端に動かなくなりました。この時確認できた原因は、セキュリティを変更したPDFはAppleScriptからの保存できないというものです。しかしながら、JavaScriptからの保存は可能です。これは言語による「できることの違い」なんていう複雑な話ではなく、単にAcrobat9.4.1のバグであろうと推測します。

再現手順:

1)PDFを開いてなんらかのセキュリティを施します。

f:id:seuzo:20101206125627p:image


2)下記のAppleScriptを実行します。

set save_path to choose file name
tell application "Adobe Acrobat Pro"
	activate
	tell active doc
		save to file save_path
	end tell
end tell

そして、失敗してエラーになりました。

f:id:seuzo:20101206125629p:image


3)試しに、saveコマンドだけでやってみます。

tell application "Adobe Acrobat Pro"
	activate
	tell active doc
		save
	end tell
end tell

これも失敗しました。saveできないってことですね。

f:id:seuzo:20101206125628p:image

ちなみに、タッチアップツールやリンクツールなどだけで変更したPDFはAppleScriptからも正しく保存できます。


4)JavaScriptから保存してみます。

上記の実験結果から、スクリプトのセキュリティに関する振る舞いが変わったのかもしれません。だとしたらJavaScriptでも同じように保存が失敗するはずです。

最初の手順としてまず、下記のようなJavaScriptを別ファイル「save.jsx」を用意します。

//save.jsx
(function () {
this.saveAs(save_path);
})();

「save.jsx」と同じ階層に下記AppleScriptを置いて実行します。

set save_path to choose file name
set save_path to (POSIX path of save_path) as Unicode text

tell application "Adobe Acrobat Pro"
	activate
	tell active doc
		do script "var save_path = '" & save_path & "';" --save.jsxのための設定(グローバル変数を利用した)
		my run_javascript_file("save.jsx") --JavaScriptファイルを実行
	end tell
end tell

----------------------------------------------●このスクリプトと同じ階層にあるjavascriptファイルを実行
to run_javascript_file(script_name)
	tell application "Finder"
		set script_folder to (container of (path to me)) as Unicode text
		set script_name to (script_folder & script_name) as alias
	end tell
	tell application "Adobe Acrobat Pro"
		do script file script_name
	end tell
end run_javascript_file

保存できました。え? じゃあセキュリティPDFの保存が禁止されているわけじゃなくて、単にバグだったんですね。

f:id:seuzo:20101206125630p:image


MyWay...

AcorobatやPDFの制御を行いたいと思う場合、その開発スタイルは多岐に渡ります。できることも大きく違い、AppleScriptだけでできることはほんのわずかです。わたしのやりたいことは、外部のスクリプトから複数のPDFに対してさまざまな処理することです。Acrobatの標準機能にバッチ処理がありますが、わたしはこの機能に満足しません。変数も繰り返しも条件分岐も外部ツールも使えない非力な機能です。ですからAppleScriptを使って自家製の「バッチ処理」でコントロールしています。その中ではAcrobatの機能も使うし、コマンドラインツールも使うし、他のアプリケーションも使うし、JavaScriptも使います。

Acorobat9.4.1アップデータはOOCタイプのセキュリティパッチです。そもそもAcorobatはなぜこうも頻繁に頻繁に頻繁にセキュリティパッチを出さなければならないのでしょうか? その原因の多くはPDF内部に埋め込まれたJavaScriptコードの実行ができるからです。その側杖をくって今回のような仕儀になりました。さらにその上、JavaScriptでできことはどんどんと狭められています。Acrobat JavaScript APIはとても複雑ですが、肝心なことができません。Acrobatのすべての機能を使いたい場合、プラグイン開発をする必要があります。

AcorobatのAppleScript対応はversion 6あたりを境に見捨てられていく方向にあります。ローカル環境でAppleScriptを使ってAcrobat操作する限りではJavaScriptよりも遥かにセキュリティリスクが低いのに……。むしろAppleScriptでこそAcrobatのすべての機能にアクセスできるべきだと思っています。

ほかの人はどうやってるんだろうね... PDFという大きな市場の中では、DTPは小さな一隅にすぎません。多分野、他業種の方々のご意見をお伺いしたいようなこころもちです。


参照

Downloads - Acrobat for Macintosh

Adobe - Acrobat : For Macintosh : Adobe Acrobat 9.4.1 Pro update - multiple languages

Release Note library | Acrobat family of products

How to save a PDF with Acrobat JavaScript | Adobe Acrobat

2010-01-15

[][][]Acrobat 8.2アップデートを当ててしまった場合の暫定的解決法

既報のことでみなさまご存知かと思いますが、Mac版Acrobat 8.2アップデートを適用するともれなくIllustrator CS&CS2とInDesign CS&CS2が起動しなくなるという問題が怒っています。

【更新】Acrobatのアップデータは充てないで - いわもとぶろぐ

あなたがもしまだこのアップデートを適用していないなら、触らぬ神にたたりなし、Acrobat 8.2アップデートはしない方がいいでしょう。(追記:2010-01-19T13:37:18+0900)(ブラウザのデフォルトPDFビューア等に)Acrobat 8系を主に使用する場合は、セキュリティホールを修正するためアップデートは必須です。Illustrator CS&CS2とInDesign CS&CS2を使用したいユーザーは、8.2アップデートをした後、下記アプリケーションを実行してください。


この問題に関して、すぐさま有志の皆様による解決法が模索され、パッチなども公開されました。

Acrobat 8.2アップデートでInDesign CS、CS2が起動できない! - InD-Board

だがしかし! Acrobat 8.2を起動するだけでパッチが無効になるという始末...

lcs_kawamuraの開発記録の情報によりますと、/Application\ Support/Adobe/TypeSpt/Unicode/Mapping/ の改行コードが変わってしまっているらしいです。

Mappingフォルダごと正常のものに差し替えればいいということですが、正常なマシンが1台もない場合だってあるでしょう。じゃあ改行コードだけ変えたらいいんじゃない? ということでスクリプトを書いてみました。

tell application "Finder"
	set tmp_file to POSIX path of (path to desktop) --デスクトップに作業ファイルを
	set tmp_file to "'" & tmp_file & "tmp.txt'"
	set target_folder to ("/Library/Application Support/Adobe/TypeSpt/Unicode/Mappings" as POSIX file) as text
	set target_files to entire contents of folder target_folder
	set my_counter to 0
	
	repeat with i in target_files
		set i to (contents of i) as alias
		if (kind of i) is not ("フォルダ" as Unicode text) then
			set a_file to quoted form of POSIX path of i
			do shell script "tr \\\\n \\\\r < " & a_file & " > " & tmp_file
			do shell script "mv " & tmp_file & " " & a_file
			set my_counter to my_counter + 1
		end if
	end repeat
	
	activate
	display dialog (my_counter as string) & "個のファイルを修正しました。"
end tell

アプリケーション形式のものはこちらからダウンロードできます:patch_of_Acrobat8_2.app.zip 直

ダブルクリックするだけで、/Library/Application Support/Adobe/TypeSpt/Unicode/Mappings内のファイルの改行コードをCR改行に書き換えます。数秒以内で終わると思います。lcs_kawamuraさんの情報に感謝します。

このスクリプトはあくまでもAdobeが修正版をリリースするまでの暫定処置です。自己責任においてご使用ください。

Adobe さんには現在のダウンロードを即座に中止し、修正版の早期リリースを望みます。


(追記:2010-04-14T15:20:35+0900)この問題は、本日公開されたAcrobat 8.2.2アップデータによって解消いたしました。したがって、このスクリプトの必要性も今後はありません。

2009-11-10

[][][][]PDF校正にはFDFの活用をおすすめしますが...

PDF校正というと、ひと昔前まではスキキライが激しくてなかなか標準的作業とは言えませんでした。現在では著者の要請でPDF校正を行うこともあるようです。

404 Blog Not Found:tips - #PDF_ - 編集するな、付箋を貼れ。

上記のエントリには詳述されていませんが、PDF上に添付した注釈は「注釈ファイル(FDF)」に書き出せます。書き出したFDFファイルは、PDF本体から注釈部分だけを抽出したファイルです。PDF校正のフローでは、このFDFを使うか使わないかで大きく作業効率が変わります。FDFを使うことによる大きな利点は2つ:

  • ファイル容量がとても小さいこと
  • 複数の注釈をひとつのPDFに取り込めること

f:id:seuzo:20091109222756g:image

ファイル容量の軽量化は一目瞭然です。高精細な画像を持つPDFは容量が重くなりがちで、何十MBもあるファイルを校正のたびに何度もサーバー上でやりとりしていてはかなりの負担になります。通常、FDFは数十KB程度に収まりますので、メールに添付してのやりとりも可能になります。

f:id:seuzo:20091109223755p:image f:id:seuzo:20091109223756p:image

FDFを使う2つ目の利点は、いくつかの注釈ファイルをひとつのファイルに集約できることです。編集者が著者校正と同時に校閲者や監修者、テクニカルチェックに回したい場合、ひとつのPDFを回覧するのではなくそれぞれのPDF上で入れた注釈をひとつのPDF上に集約できます。編集者は赤字転記の手間がはぶけけ、誤転記を防げます。


FDFが普及しないワケ

そんないいことづくめのFDFですが、校正の現場ではなかなか普及していないようです。Acrobat Readerでは特別な許可がないと注釈を入れることすら許可されていないからです*1。この許可がなければFDFの書出しもできません。

コラム・雑感 Adobe Readerで注釈を入れられるようにするには?/T-STUDIO

上記エントリにあるように、元PDFを作成するAcrobat Pro側で「Acrobat Readerで注釈を有効にする...」としてPDFを書き出す必要があります。

f:id:seuzo:20091109223757p:image


まあこんな事情ですから、編集者、筆者および関係者は、グループ内のAcrobat Proを持たないユーザーに合わせてワークフローを標準化しなくちゃいけません。FDFを使わないで、どんな重いデータもFTPサーバーなどを介して何度もやりとりしなくちゃいけません。他にもPDF校正にはセキュリティや互換バージョン、オーバープリントプレビューなど結構気を使うことも多いんです。PDFの利点が薄れてしまうと、PDF校正そのものに消極的になってしまいますね。「あー、こんな面倒ならいままで通り紙でいいじゃん。見やすいしね。バイク便呼んで〜!」なんて声すら聞こえてきます。考えてみればAdobeさんはPDF校正が普及しようとしまいと、どーでもいいことなんでした。


参照

Acrobat/PDF:FDFファイルのやりとり - DTP Transit

*1:Mac OSに標準添付されているプレビューでは、許可がなくても注釈を入れられます

2009-10-20

[][][]ボタンについて

Button Fieldsについてのメモ。ボタンはFieldオブジェクトの一種。Button fieldsの和訳と解説

(function () {

//myButtonという名前でボタンを1ページ目に作成する
//引数は左から、名前、種類、ページ数 - 1、座標
var f = this.addField("myButton", "button", 0, [200, 250, 250, 400]);


//「myButton」という名前を持つフィールドの参照を得る。
var f = this.getField("myButton");


//strokeColorプロパティで、境界線の色を「blue」に設定する。
f.strokeColor = color.blue;


//borderStyleプロパティで、境界線のスタイルを「border.b」(beveled:ベベル)に設定する。設定できる定数は下記の通り
//「border.s」(solid:実線)
// 「border.b」(beveled:ベベル)
//「border.d」(dashed:破線)
//「border.i」(inset:切り込み)
//「border.u」(solid:underline)
f.borderStyle = border.b;


//lineWidthプロパティで、境界線の太さを1(pt)に設定する。
f.lineWidth = 1;


//fillColorプロパティで、領域内の塗りを「color.yellow」(黄色)に設定する。
f.fillColor = color.yellow;


//buttonSetCaption()メソッドでラベルを付けると、ボタン上にテキストが表示される。
//「オプション」タブの「ラベル」に相当
f.buttonSetCaption("Click Here");


//テキストのサイズ/色/フォントを指定する
f.textSize = 16;
f.textColor = color.red;
f.textFont = font.Times;


//userNameプロパティを設定すると、マウスオーバーした時にTooltipを表示する。
f.userName = "マウスを重ねるとtooltip(コレ)を表示します";


//テキストとアイコンの相対位置を設定する。この場合はテキストの左にアイコンが配置される
//「オプション」タブの「レイアウト」に相当
f.buttonPosition = position.iconTextH;


//displayプロパティはボタンを表示(または印刷)するかどうかを設定する。
//「一般」タブの「一般プロパティ:表示と印刷」の設定に相当
f.display = display.visible;


//highlightプロパティは、クリック時のボタンの動作を設定する。
//「オプション」タブの「動作」に相当。定数は下記から選べる。
//「highlight.n」(none:なし)
//「highlight.p」(push:プッシュ)
//「highlight.o」(outline:アウトライン)
//「highlight.i」(invert:反転)
f.highlight = highlight.p;


//ボタンにアイコンを配置する
//(その1)buttonImportIconメソッドで直接指定。
var retn = f.buttonImportIcon("hoge.jpg");//絶対パスでも相対パスでもOK
if ( retn != 0 ) app.alert("Icon not imported");

//(その2)DocオブジェクトのimportIconメソッドを使って、予め名前をつけて収納しておき、buttonSetIconメソッドで名前指定
//this.importIcon({cName: "myIconName", cDIPath: "/hoge/fuga.jpg", nPage: 0});
//var myIcon = this.getIcon("myIconName");
//f.buttonSetIcon(myIcon);


//buttonScaleWhenプロパティは、アイコンのサイズ調整をするかどうか
//「オプション」タブの「レイアウト」の「詳細設定...」ボタン中の「アイコンを配置」ダイアログの「サイズを変更「オブションに相当。定数は以下のとおり。
//「scaleWhen.always」(always:常に調整)
//「scaleWhen.never」(never:調整しない)
//「scaleWhen.tooBig」(too big:大きすぎる場合)
//「scaleWhen.tooSmall」(too small:小さすぎる場合)
f.buttonScaleWhen = scaleWhen.always;


//buttonScaleHowプロパティは、アイコンがフィットする時の倍率についての設定(アイコンがあってもなくてもなぜかエラーになる)
//「オプション」タブの「レイアウト」の「詳細設定...」ボタン中の「アイコンの配置」ダイアログの「倍率」オブションに相当。定数は以下のとおり。
//「buttonScaleHow.proportional」(proportional:元の縦横比を保つ)
//「buttonScaleHow.anamorphic」(anamorphic:ボタンに合わせる)
//f.buttonScaleHow = buttonScaleHow.anamorphic;


//「buttonScaleHow.proportional」の時、アイコンをボタンの境界線に合わせるかどうか。(アイコンがあってもなくてもなぜかエラーになる)
//「オプション」タブの「レイアウト」の「詳細設定...」ボタン中の「アイコンの配置」ダイアログの「境界線に合わせる」チェックボックスに相当。
//f.buttonFitBounds = true;


//「buttonScaleHow.proportional」の時、アイコンの座標位置。原点は左下、単位は%。
//「オプション」タブの「レイアウト」の「詳細設定...」ボタン中の「アイコンの配置」ダイアログの「ボタン」スライダに相当。
f.buttonAlignX = 30;
f.buttonAlignY = 50;


//rotationプロパティは、ボタンの回転角度を指定する(が、なぜか1つしか回転しない)
//「一般」タブの「一般プロパティ:向き」の設定に相当
//「0」「90」「180」「270」の値だけが有効。「45」や「-90」などを指定するとエラーになる。
f.rotation = 90;


//アクションの割り付け(何度も実行すると、回数分アクションがつく)
//第一引数は「トリガを選択」定数は下記の通り
//「MouseUp」(マウスボタンを放す)
//「MouseDown」(マウスボタンを押す)
//「MouseEnter」(ポインタを範囲内に入れる)
//「MouseExit」(ポインタを範囲外に出す)
//「OnFocus」(フォーカスを合わせる)
//「OnBlur」(フォーカスを外す)
f.setAction("MouseUp", "app.alert('呼ばれて飛び出てジャジャジャーン!');" );

})();

button_test.pdf 直

f:id:seuzo:20091021000046g:image

Button Fieldsは、たとえばLinkオブジェクトよりも操作できるプロパティやメソッドは断然多い。となれば、論理構造を無視できるならLinkオブジェクトはFieldオブジェクトでも代用できるってこと? Link用途にFieldオブジェクトを使ってはいけない理由ってありますか?