Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PDF出力時にPDFのアノテーション情報にもTeXソース情報を含める #48

Closed
doraTeX opened this issue Sep 29, 2015 · 43 comments

Comments

@doraTeX
Copy link
Owner

doraTeX commented Sep 29, 2015

新機能案:「PDF出力時にPDFのアノテーション情報にもTeXソース情報を含める」

メリット

  • LaTeXiT のように,PowerPoint からのドラッグ&ドロップでTeXソースを復元できる。

仕様案

  • 「ソースを復元できるようにする」(--embed-source) がON,かつ出力形式がPDFの場合には,PDFのアノテーション情報にもTeXソース情報を含める。
  • そのアノテーション情報には「TeX2imgが埋め込んだソース」というラベルを付けておく。
  • PowerPoint などからPDF画像がTeX2imgのソース入力欄にドラッグされた場合,「TeX2imgが埋め込んだソース」というラベルが付いたアノテーション情報を探し,それがあればドラッグを受け付ける。
  • それがドロップされた場合,従来の TeX ソース復元機能と同じルーチンを発動させてソースを復元する。
  • 一方,Finderからのファイルのドラッグ&ドロップによるソース復元時は,引き続き拡張属性を利用して復元する。
  • 保険的補助機能として,「拡張属性がなくてもPDFのアノテーション情報に『TeX2imgによって埋め込まれたTeXソース』を発見した場合には,それを利用して復元する」機能を付ける。これにより,Windowsとのやりとりなどによって拡張属性が失われてしまったPDFについても,保険的にそちらからソースを復元できる。

検討事項

  • 「拡張属性へのソース保存」と「PDFのアノテーション情報へのソース保存」を独立にON/OFFを切り替えられるオプションは必要か。➡ 分かりにくいので,今のところ,これらは「ソースを復元できるようにする」(--embed-source) によって一体でON/OFFが切り替わる仕様で問題ないのではと考えている。

制限

  • 最新版の Keynote は図版を Keynote 外にドラッグすることができなくなっているので,Keynote からのソース復元はできない。この制限は LaTeXiT も同様。
@doraTeX
Copy link
Owner Author

doraTeX commented Sep 29, 2015

上記仕様に従って一通り実装完了。
Word 2011 / Excel 2011 / PowerPoint 2011 に貼り込んだ図版から TeX2img へのドラッグ&ドロップで画像を復元できることを確認。

@doraTeX
Copy link
Owner Author

doraTeX commented Sep 30, 2015

追加仕様

  • ドラッグ&ドロップだけでなく,コピー&ペーストでも復元を可能にした。
  • PowerPoint でソース情報入りの画像をコピーし,TeX2img のソース入力欄上でペーストを行うと,「よろしいですか」の確認ダイアログを経て,PDFに埋め込まれたソース情報を復元できる。

@doraTeX
Copy link
Owner Author

doraTeX commented Sep 30, 2015

現状の実装を Ver. 2.0.4 beta 1 としてまとめておきました。

@aminophen
Copy link

Ver. 2.0.4 beta1 を起動しようとするとクラッシュしました。例によって Lion です。

15/09/30 15:19:31.746 [0x0-0x71071].com.loveinequality.TeX2img: objc[622]: cannot form weak reference to instance (0x7f8aa986cd00) of class NSWindow
15/09/30 15:19:32.437 com.apple.launchd.peruser.502: ([0x0-0x71071].com.loveinequality.TeX2img[622]) Job appears to have crashed: Illegal instruction: 4
15/09/30 15:19:32.576 ReportCrash: Saved crash report for TeX2img[622] version ??? (2.0.4b1) to /Users/npjilab/Library/Logs/DiagnosticReports/TeX2img_2015-09-30-151932_iwai-no-iMac.crash
15/09/30 15:19:32.577 ReportCrash: Removing excessive log: file://localhost/Users/npjilab/Library/Logs/DiagnosticReports/TeX2img_2015-08-24-183214_iwai-no-iMac.crash

@doraTeX
Copy link
Owner Author

doraTeX commented Sep 30, 2015

これは本件とは無関係で, 0d010c9 に関連するこの問題でした。
0d010c9 を Revert してビルドし直し, Ver. 2.0.4 beta 1 を差し替えておきました。

@aminophen
Copy link

これは本件とは無関係で, 0d010c9 に関連するこの問題でした。

そういえば、仕様が変わったのでしたね… 属性を消して元に戻しても、新しい OS で正常に動作するのでしょうか?

PDF のアノテーションへの埋め込みと復元が正常に機能することを確認しました。仕様については上記のもので良いと思います。

@doraTeX
Copy link
Owner Author

doraTeX commented Sep 30, 2015

属性を消して元に戻しても、新しい OS で正常に動作するのでしょうか?

とりあえず大丈夫そうです。

PDF のアノテーションへの埋め込みと復元が正常に機能することを確認しました。

確認ありがとうございます。
これで MS Office は大丈夫ですね。

Keynote からのソース復元が何とかできないか試してみましたが,最新版 Keynote では,貼り込むときにPDF内の余計な情報(PDF内のアノテーションや余計なコメント)を削除して整理してから貼り込むようで,付加情報を保持させたまま貼り込むのは困難そうです。(これは LaTeXiT も同様です。)

@doraTeX
Copy link
Owner Author

doraTeX commented Sep 30, 2015

Keynote はSVGをサポートしておらず,EPSもPDFに変換されて貼り込まれるので,ベクター画像を付加情報込みで Keynote に貼り込む手は全て封じられてしまいました。

@aminophen
Copy link

Keynote からのソース復元が何とかできないか試してみましたが,

それについては元々 TeX2img の EA を使う仕組みのほうが優れていると思っていたので気にしていませんでした。画像形式によってそれぞれ対応するのは面倒ですし、たとえ頑張っても途中でソースが切れるかもしれないと思うと、PDF アノテーションだけにとどめた今の方法が最善だと思います。

Keynote 仕様変更で復元できなくなって残念がる人多いでしょうね。

@doraTeX
Copy link
Owner Author

doraTeX commented Sep 30, 2015

では現行の仕様で満足するとしましょう。
続いて,これを Snow Leopard 版にも実装してみます。

@aminophen
Copy link

では現行の仕様で満足するとしましょう。
続いて,これを Snow Leopard 版にも実装してみます。

よろしくお願いいたします。
PDF を挿入できるところが Office for Mac のうらやましいところでもあります。Windows で PDF をドラッグ・ドロップで PowerPoint に貼り付けられると良いのですが、どうもうまくいかない場合(そもそも画像が表示されない or 表示されてもディスプレイ上では汚い)が多いので EMF サポートを再開していただいたわけですが、やはり PDF のほうが使い勝手は良いですからね…

@doraTeX
Copy link
Owner Author

doraTeX commented Sep 30, 2015

Snow Leopard 版にも導入しました。
仮想マシンに構築した Snow Leopard 上でのテストが成功すれば,そろそろ 2.0.4 / 1.10.4 のリリースと行きましょうか。

今回の改良点

@doraTeX
Copy link
Owner Author

doraTeX commented Sep 30, 2015

実装の詳細

  • PDF出力時,ソース埋め込みがON (--embed-source) の場合は,出力PDF(複数の場合は全て)の1ページ目にアノテーション情報としてソースを埋め込む。
  • 1ページ目の座標 (0,0) に,0x0 の大きさの長方形としてテキスト形式のアノテーションを埋め込む。
  • アノテーションの画面表示属性,印刷属性はOFFに設定。
  • アノテーション情報は,%%TeX2img Document というラベル用の行から始まる。2行目以降が本来のソース(UTF-8)。
  • 復元時は,1行目が %%TeX2img Document であるテキスト形式アノテーションを検索し,それがあれば2行目以降をソースとして復元。

※ 当初はアノテーションを書き込んだ著者名として TeX2img などと設定し,それによってラベルとしようと考えていたが,なぜかその方法でアノテーションの著者名を書き込んだPDFを作成したものを Preview.app で開くと Preview がクラッシュするというバグがあったので,その方法は中止。1行目にラベル行を設けるという実装法に変更した。

@doraTeX doraTeX closed this as completed Oct 1, 2015
@abenori
Copy link

abenori commented Oct 1, 2015

同じようにしてみています.テストのために,そっちで作ったPDFファイルをもらってもよいですか?

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 1, 2015

こちら になります。

@abenori
Copy link

abenori commented Oct 1, 2015

早っ!ありがとうございます.

@abenori
Copy link

abenori commented Oct 3, 2015

時間がかかってしまいましたが,やっと同じようなことができました.生成したtest.pdfをおいてみましたが,きちんとできてますでしょうか?一応そちらのPDFは読めました.

https://onedrive.live.com/redir?resid=4FABCB4EC4FA1E70!16825&authkey=!ANYoMX5Yq7PLXU4&ithint=folder%2cexe

@aminophen
Copy link

!!!

Mac から Windows にソースを運べました。Windows から Mac は(いま Mac 環境にいないので)試せていません。一つだけ、出力すべきファイルと一緒に一時ファイルもろとも附いてきたことにびっくりしましたが…

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 3, 2015

お疲れ様です!
OS の API で注釈の読み書きができる Mac とは異なり,Windows でそれを実現するのはさぞ大変だっただろうと想像します。
試してみたところ,Windwos 側で付けた注釈は改行コードが CR+LF であったためにヘッダ行がヘッダ行と認識されず,ソース復元に失敗してしまいました。
確かに, OS をまたぐときは改行コードが問題になりますね(ヘッダに限らず)。

  • MacでPDF内のテキスト形式の注釈を読むときは,CR+LF は LF に置換してから読み始める。
  • WindowsでPDF内のテキスト形式の注釈を読むときは,CR に続かない LF は CR+LF に置換してから読み始める。

という処理を入れてはいかがでしょう。

@abenori
Copy link

abenori commented Oct 3, 2015

MuPDFがその機能を持っていたのでそれ自身はよかったのですが,ドキュメントが貧しすぎて苦労したのと,プロセスを起動してやりとりする部分を書くのが面倒でした.(dllでのダイナミックリンクにすればよいのですが,それは封じられているので…….)

こちらは

CR に続かない LF は CR+LF に置換してから読み始める。

を既にしてあるので,改行コードに関係なく読めるはずです.確かに内部は全部CRLFにした気がするので,注釈もCRLFでしょうね.

MacでPDF内のテキスト形式の注釈を読むときは,CR+LF は LF に置換してから読み始める。

をしてもらえるとよいかなと思います.

Mac から Windows にソースを運べました。

._hoge.jpg(でしたっけ?)みたいなファイルを読めば他の形式でも行けるでしょうか.このファイルどういう形式になっているのでしょう?

一つだけ、出力すべきファイルと一緒に一時ファイルもろとも附いてきたことにびっくりしましたが…

ありゃ,なんか変ですね.

@aminophen
Copy link

一つだけ、出力すべきファイルと一緒に一時ファイルもろとも附いてきたことにびっくりしましたが…

ありゃ,なんか変ですね.

よくみると、TeX2img のコンソールに出てくる一時ファイル名とは異なるファイル名の PDF ファイルが、出力先ディレクトリに生成していました。こちらにはソースが埋め込まれていないことを除き、内容は本来出力すべきものと同じになっています。

  • 「ソース埋め込み機能」を無効化するとこのような余分なファイルは出てきません。
  • PDF 以外の形式では余分なファイルは出てこないようです。

@abenori
Copy link

abenori commented Oct 3, 2015

はい,注釈をつける際に作った一時ファイルでしょう.多分mudrawのプロセス終了以前にこのファイルを消そうとしてしまっているのではないかと思います.(プロセスがつかんでいるので消せない.)何度か試してみると手元ではランダムで残ったりそうでなかったりしているので.
最大1秒までプロセス終了を待つことに手元でしてみました.多分これで大丈夫かと思います.

@aminophen
Copy link

はい,注釈をつける際に作った一時ファイルでしょう.多分mudrawのプロセス終了以前にこのファイルを消そうとしてしまっているのではないかと思います.

作業ディレクトリの中で注釈をつけてから,ということはできないでしょうか?

@abenori
Copy link

abenori commented Oct 3, 2015

できなくはないのですが,ソース埋め込みの処理を一カ所にまとめておきたいのと,埋め込み処理は出力フォルダでした方がよいと思うのとで,今みたいになっています.1秒待って終了処理が終わらないことはまずないと思うので大丈夫かと.

@aminophen
Copy link

ソース埋め込みの処理を一カ所にまとめておきたい

確かに一箇所のほうが分岐が少ない、と思ったのですが

埋め込み処理は出力フォルダでした方がよいと

これは NTFS かどうかに関わるからだと思ったのですが、FAT でもアノテーションへの埋め込みはやったほうがよいので、あまり分岐が減った気がしないかなという感じがしました。実装がどうなっているのか分かっていないのであてずっぽうで申し訳ありませんが…

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 3, 2015

MacでPDF内のテキスト形式の注釈を読むときは,CR+LF は LF に置換してから読み始める。

をしてもらえるとよいかなと思います.

この処理を入れたところ,めでたく Windows の注釈を復元できました!
ソース情報の互換性実現,感動的です。

._hoge.jpg(でしたっけ?)みたいなファイルを読めば他の形式でも行けるでしょうか.このファイルどういう形式になっているのでしょう?

これは情報が少ないですね……。普通,このファイルは他のOSでは目障りで削除される対象なので,その内容を解析しようとした試みがほとんど見当たりません。
一応,Wikipedia のリンクに,フォーマット仕様書,および Perl を用いた読み込みモジュールの実装が見つかりましたが。

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 3, 2015

Windows との互換性を実現した Ver. 2.0.5 beta 1 を置いておきました。

@abenori
Copy link

abenori commented Oct 3, 2015

それでは極力一時フォルダで作業するようにしてみました.(ちなみにこのファイルは設定によらず消えるようにしています.)

これは情報が少ないですね……。普通,このファイルは他のOSでは目障りで削除される対象なので,その内容を解析しようとした試みがほとんど見当たりません。
一応,Wikipedia のリンクに,フォーマット仕様書,および Perl を用いた読み込みモジュールの実装が見つかりましたが。

ありがとうございます.さくっとできそうならばと思ったのですが,ちょっと面倒そうですね…….まぁ気が向いたら試してみます.
もしこのファイルの実物があるようでしたらもらえますか?

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 3, 2015

このzip を展開すると,__MACOSX の中に ._test.pdf があるはずです。
Macでこのzipを展開すると,__MACOSX フォルダは掘られず,代わりに中身が拡張属性にインプットされます。

一方,zip圧縮ではなく,FAT32のUSBメモリやネットワークボリュームに test.pdf を書き込むと,__MACOSX フォルダは掘られず,直に ._test.pdf が作られます。その場合に作成されるファイルはこちらです。

両者のファイルは少し異なるようです。

これらのファイルをバイナリエディタでダンプしてみたところ,意外と読み取りが簡単そうな構造ですね(^^;

2015-10-04 2 13 00

2015-10-04 2 23 54

@abenori
Copy link

abenori commented Oct 3, 2015

ありがとうございます.ちょっとやるか悩みますが,読めるには読めそうですね.まぁ少しさきほどのリンク先もこめて眺めてみます.

今普段使っている解凍ソフトでやったら__MACOSXが現れませんでした.設定に「MACリソースフォークを読み飛ばす」というのがあって,それがデフォルトでONになっていたようです.確かにあまり残らず実装しても無駄な可能性が高いかもしれません……

@abenori
Copy link

abenori commented Oct 3, 2015

Wikipedia最初のリンクの仕様と照らし合わせてもらったファイルを見てみました.9byte目から16byteは0で埋められていると書いてあるのに全然埋まっていないのが気になりますが…….
どうもどちらもFinder Infoというのに入っているようなので,次はこれのフォーマットをしる必要がありそうなのですが,ご存じですか?

しかし最初のリンクの仕様のやつ,Appleのサイトじゃないですね.Appleは情報を公開していないのかな.そうするとあまりやる気がなくなってきたり…….

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 4, 2015

リンク先の仕様書,日付が1990年とか1994年とか書いてあって相当に古いですので,今は変わっている可能性が高いですね。Appleのサイトに仕様書が見つかりませんし,Finder Info の仕様も含め,最新の仕様は公開されていないのかもしれません。

@abenori
Copy link

abenori commented Oct 4, 2015

Finder Infoのヘッダとかを表す構造体が手元の環境のどっかのヘッダファイルにあったりしないでしょうか?

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 4, 2015

探しまくった結果,どうやらこれが該当しそうです。

@abenori
Copy link

abenori commented Oct 4, 2015

おお,すげーありがとうございます.やる気が出てきました.

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 4, 2015

上記リンクのファイル名は vfs_xattr.c ですが,名前的にHFS+方は hfs_xattr.c が該当するのでしょうね。

@abenori
Copy link

abenori commented Oct 4, 2015

https://onedrive.live.com/redir?resid=4FABCB4EC4FA1E70!16825&authkey=!ANYoMX5Yq7PLXU4&ithint=folder%2cexe

おかげさまで読み込むことができるようになりました.処理部分をきちんと呼んだわけではないので,正確かそこまで自信がないですが……おそらく

https://github.com/abenori/TeX2img/blob/master/AppleDouble.cs

の上の方に書いた仕様かと思って処理しています.とりあえずいただいたサンプルは処理できているっぽいです.

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 4, 2015

おおっ,これはすごい!!
通常ゴミファイル扱いされる ._hoge.pdf の内容をまともに読もうとしたプログラムは世界的にも極めて異例と思われます。TeX2img がその道を開拓したとは感動的です!

このソースは自分にとっても貴重な資料です!ありがとうございます。

@abenori
Copy link

abenori commented Oct 4, 2015

ゴミファイル扱いされるが故に実装した意味があるかは激しく謎ですが(笑)

そういえば教えてもらったソースはリソースフォークも見ているように見えるのですが,TeX2imgの場合はFinder情報の拡張属性に必ず入ると仮定しても大丈夫でしょうか?

@doraTeX
Copy link
Owner Author

doraTeX commented Oct 4, 2015

setxattr を使って書き込むと,Finder Info の方に入るということでよさそうですね。

@doraTeX doraTeX reopened this Oct 4, 2015
@aminophen
Copy link

実際に Win と Mac でファイルを行ったり来たりさせる実験を行ってみました。

  • Mac 版 TeX2img で HFS+ な場所に PDF や PNG を出力したのち、FAT32 な USB メモリで Windows に持っていって見ると、確かに Apple Double でファイルが分裂していました(拡張属性側が隠しファイル)。本体のファイルを FAT32 な場所からドラッグアンドドロップすることで、見事 Windows 版 TeX2img でソース復元に成功しました!
  • WIndows 版 TeX2img で NTFS な場所に PDF を出力したのち、FAT32 な USB メモリにコピーすると「プロパティを含めずにコピーしますか?」と確認が出ます(このときに拡張属性のソースが落ちるわけですよね)。これを Mac で読み込むと、見事アノテーションからの復元に成功しています!
  • 先ほどの Mac 版 TeX2img で出力した PDF と PNG の拡張属性を USB メモリから Windows 上で削除し、それを Mac に持っていくと PDF のみソースを復元できました。つまりアノテーションからの復元が正しく働いていることになります!

というわけで、テストの範囲内ではすべて期待通りに動作していました。以上でテストとしては十分でしょうか?

Windows で NTFS の拡張属性を積極的に活用したのみならず、Apple Double の拡張属性のほうを読むというこれまた画期的な実装が行われたことは感動的です。

@aminophen
Copy link

なお、本件とは別ですが Windows 版は最近 --margins オプションが実装されています。

  /margins=<VAL>           余白(一括/左右 上下/左 上 右 下)

これは pdfcrop.pl と同じようにスマートに余白を指定できる機能です。Mac 版にも付くと嬉しいです。

@abenori
Copy link

abenori commented Oct 5, 2015

ありがとうございます.大丈夫そうですね.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants