PDF のしおりの文字化けの対策

PDF のしおりの文字化けの対策

- 質問 回答 の投稿
返信数: 0
powerdot で作った dvi を dvips で PostScript ファイルにする際の
対策については大変お世話になりました。

しおりの文字化けの問題が残っていますが、dvips と bkmk2uni や
convbkmk.rb と Ghostscript の ps2pdf を使って作った PDF の
しおりの文字化けは、Ghostscript のバグが原因のようなので、
根本的な解決はバグフィックスを待つことにします。
しかしながら、Adobe Distiller が使えない状況でどうしても何とか
したいときの対策を探ってみました。

一つの方法として、qpdf で uncompress して (バイナリ) エディタ
などで文字化けした部分を ps2pdf で変換する前の PostScript ファイル
に含まれている正しい <feff ... > に置き換えると上手く行きました。

sample.ps 内を "/Dest .*/Title" の正規表現の検索等でしおりの
<feff4f5c6226306e69828981> のような文字列を見付けておきます
(あるいはこの文字列を直接作ってしまった方が早いかもしれません)。

qpdf --stream-data=uncompress sample.pdf sample-x.pdf

で uncompress した sample-x.pdf 内を "/Dest .*/Title" の正規表現の
検索等で (..O\\010&0ni\202\211\201) のような文字化けした部分を
見付けます (最初の .. の所は、feff の BOM の2バイト)。
この部分を上で見付けておいた <feff4f5c6226306e69828981> に
置き換えてしまいます (sample-x2.pdf)。

ただし、このようにすると cross-reference table が壊れるようです。

qpdf --stream-data=preserve sample-x2.pdf sample-x3.pdf

のようにすると

WARNING: sample-x2.pdf: file is damaged
WARNING: sample-x2.pdf (file position 377240): xref not found
WARNING: sample-x2.pdf: Attempting to reconstruct cross-reference table
qpdf: operation succeeded with warnings; resulting file may have some problems

が表示されるので cross-reference table を再構築するようです。

sample-x.pdf と sample-x3.pdf の違いを調べると cross-reference table
以外は、(..O\\010&0ni\202\211\201) が (..O\\b&0ni\202\211\201)
のように2箇所の文字化け (...) の部分の 010 が b に置き換わって
いただけでした。
実際、(バイナリ) エディタ等で sample-x.pdf 内の2箇所の 010 を b に
置き換え、直後の閉じ丸括弧の後に半角空白文字を2つ加えたものは、
cross-reference table も壊れず、sample-x3.pdf 相当のものが出来ました。

qpdf --stream-data=compress sample-x3.pdf sample.pdf

とすれば、compress された正常な pdf が出来るようです。