LualaTeXでヒラギノフォントを使用するとAcrobatなどでの表示はできるもののPDFのフォーマットとしては正しくないファイルが生成されるようです。
使用しているLuaTeXは以下の通りです。
This is LuaTeX, Version beta-0.75.0-2013033008 (TeX Live 2012/W32TeX)(rev 4604)
次のような簡単な内容でタイプセットすると、
%=============================
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont{HiraKakuPro-W3}
\begin{document}
あ
\end{document}
%=============================
生成されたPDFファイル(添付)で、object ID 8のDirectory要素が
==============================
8 0 obj
<<
stream
endstream
endobj
==============================
と正しく出力されていないと思います。こんなことが起きているのは
私だけでしょうか?
初心者なので勘違いしているかもしれません。どなたかこの件で
お分かりになるかたがいらっしゃったら助けてください。
よろしくお願いします。
※ PDFファイルを見るだけならいいのですが、該当ファイルから
ページを抽出したりなどPDFを加工できなくて困ってます。
遅くなりました.
ヒラギノは持っていないので,小塚明朝 Pr6N R で試しましたが,
同じような症状になっています.
plain LuaTeX 用の,次のソースでも同じです:
========
%#! luatex
\input luaotfload.sty
\font\x=file:KozMinPr6N-Regular.otf
\x
あ
\end
========
使用している LuaTeX は,
This is LuaTeX, Version beta-0.76.0-2013041508 (rev 4627)
(x86_64-linux, tlpretest 2013)
です.luaotfload 側にエスケープシーケンスの修正を
2箇所入れていますが,それは関係ない……はず.
ヒラギノは持っていないので,小塚明朝 Pr6N R で試しましたが,
同じような症状になっています.
plain LuaTeX 用の,次のソースでも同じです:
========
%#! luatex
\input luaotfload.sty
\font\x=file:KozMinPr6N-Regular.otf
\x
あ
\end
========
使用している LuaTeX は,
This is LuaTeX, Version beta-0.76.0-2013041508 (rev 4627)
(x86_64-linux, tlpretest 2013)
です.luaotfload 側にエスケープシーケンスの修正を
2箇所入れていますが,それは関係ない……はず.
どこが影響しているのか探ってみました。
texk\web2c\luatexdir\font\writecff.w(3377): からで
/* CIDSet: a table of bits indexed by cid, bytes with high order bit first,
each (set) bit is a (present) CID. */
if (0) {
の部分に起因するみたいです。正しい実装がどういうものかはわからないですが
pdf_end_dict() が無いなど適切ではないと思います。一旦は先頭の
if (1) {
を
if (0) {
とこのブロックを無効にしたほうがよいと思います。無効にしたもので出力した
PDFファイルは分割やページ抽出など問題なく操作できました。
texk\web2c\luatexdir\font\writecff.w(3377): からで
/* CIDSet: a table of bits indexed by cid, bytes with high order bit first,
each (set) bit is a (present) CID. */
if (0) {
cidset = pdf_create_obj(pdf, obj_type_others, 0);}
if (cidset != 0) {
size_t l = (last_cid / 8) + 1;}
char *stream = xmalloc(l);
memset(stream, 0, l);
for (cid = 1; cid <= (long) last_cid; cid++) {
if (CIDToGIDMap[2 * cid] || CIDToGIDMap[2 * cid + 1]) {}
stream[(cid / 8)] |= (1 << (7 - (cid % 8)));}
pdf_begin_obj(pdf, cidset, OBJSTM_NEVER);
pdf_begin_dict(pdf);
pdf_begin_stream(pdf);
pdf_out_block(pdf, stream, l);
pdf_end_stream(pdf);
pdf_end_obj(pdf);
の部分に起因するみたいです。正しい実装がどういうものかはわからないですが
pdf_end_dict() が無いなど適切ではないと思います。一旦は先頭の
if (1) {
を
if (0) {
とこのブロックを無効にしたほうがよいと思います。無効にしたもので出力した
PDFファイルは分割やページ抽出など問題なく操作できました。
どうもありがとうございます。 Taco さんに連絡しておきます。 以下のような変更では、やはり矛盾した pdf ができるでしょうか? pdf_begin_obj(pdf, cidset, OBJSTM_NEVER); pdf_begin_dict(pdf); pdf_begin_stream(pdf); pdf_out_block(pdf, stream, l); pdf_end_stream(pdf); pdf_end_obj(pdf); を、以下に変える。 pdf_begin_obj(pdf, cidset, OBJSTM_NEVER); pdf_begin_dict(pdf); pdf_dict_add_streaminfo(pdf); pdf_end_dict(pdf); pdf_begin_stream(pdf); pdf_out_block(pdf, stream, l); pdf_end_stream(pdf); pdf_end_obj(pdf);
やってみました。pdf_begin_dict()のあとに次の二行を追加すれば、
pdf_dict_add_streaminfo(pdf);
pdf_end_dict(pdf);
==============================
10 0 obj
<</Length 13 /Filter/FlateDecode>>
stream
xレc` z ← 以前は空白だけだったのが、何かデータが埋まってる。(無理やりバイナリを貼り付けましたので文字化けしてます)
endstream
endobj
==============================
うまくPDFが出力できているようです(データの内容は分かってませんが)。
このPDFファイルも分割やページ抽出など問題なく操作できました。
pdf_dict_add_streaminfo(pdf);
pdf_end_dict(pdf);
==============================
10 0 obj
<</Length 13 /Filter/FlateDecode>>
stream
xレc` z ← 以前は空白だけだったのが、何かデータが埋まってる。(無理やりバイナリを貼り付けましたので文字化けしてます)
endstream
endobj
==============================
うまくPDFが出力できているようです(データの内容は分かってませんが)。
このPDFファイルも分割やページ抽出など問題なく操作できました。