lualatex にヒラギノフォントを使用すると不正なPDFが生成される?

lualatex にヒラギノフォントを使用すると不正なPDFが生成される?

- KWTMS の投稿
返信数: 6
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を加工できなくて困ってます。

KWTMS への返信

Re: lualatex にヒラギノフォントを使用すると不正なPDFが生成される?

- KWTMS の投稿
ちなみに全く同じソースをXeLaTeXでタイプセットしてもDirectory要素が閉じていないようなことはなく、正しいと思われるPDFが出力されました。
KWTMS への返信

Re: lualatex にヒラギノフォントを使用すると不正な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箇所入れていますが,それは関係ない……はず.
北川 弘典 への返信

Re: lualatex にヒラギノフォントを使用すると不正なPDFが生成される?

- Akira Kakuto の投稿
authors に問いあわせてみました。 
Akira Kakuto への返信

Re: lualatex にヒラギノフォントを使用すると不正なPDFが生成される?

- KWTMS の投稿
どこが影響しているのか探ってみました。

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ファイルは分割やページ抽出など問題なく操作できました。
KWTMS への返信

Re: lualatex にヒラギノフォントを使用すると不正なPDFが生成される?

- Akira Kakuto の投稿
どうもありがとうございます。 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);
 
Akira Kakuto への返信

Re: lualatex にヒラギノフォントを使用すると不正なPDFが生成される?

- KWTMS の投稿
やってみました。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ファイルも分割やページ抽出など問題なく操作できました。