それは確かに面白いです。OP によって提供されるサンプル PDF には実際に大文字が目に見えて含まれており、一部は大文字のみの行に、一部は大文字と小文字が混在する行に含まれており、Adobe Reader によって小文字として抽出されます。
あなたは疑問に思います
この問題の原因は何ですか?
例として、それがどのように起こるかを見てみましょうPelle Più bella
ページ コンテンツでは、このフレーズは実際には大文字の視覚的表現のように見えます。
/T1_0 1 Tf
-0.025 Tc 12 0 0 12 379.5354 554.8809 Tm
(PELLE PI\331 BELLA)Tj
使用されているフォントT1_0 (DIN-Bold サブセット) を見ると、WinAnsiEncodingを使用していると主張していることがわかります。これは、ページ ストリーム内のこれらの文字コードを大文字として解釈することも示します。
ただし、フォントにはToUnicodeマッピングもあり、このマッピングがマップされます
<41> <0061> — 'A' → a
<42> <0062> — 'B' → b
<43> <0043> — 'C' → C
<44> <0044> — 'D' → D
<45> <0065> — 'E' → e
<49> <0069> — 'I' → i
<4C> <006C> — 'L' → l
<4D> <004D> — 'M' → M
<4E> <006E> — 'N' → n
<50> <0050> — 'P' → P
<52> <0072> — 'R' → r
<53> <0053> — 'S' → S
<54> <0074> — 'T' → t
<D9> <00F9> — 'Ù' → ù
(WinAnsiEncoding で大文字を表す文字コードからのみマッピングを抽出しました。)
ネイティブ ファイル (InDesign) を pdf に保存して、フォントの抽出を改善するより良い方法はありますか?
申し訳ありませんが、私は InDesign にはあまり興味がありません。しかし、そのソフトウェアが Adobe からのもので、それが InDesign のバグなのか、PDF へのエクスポートなのか、私は驚くでしょう。代わりに、 PELLE PIÙ BELLAをPelle Più bellaとしてタグ付けする InDesign ファイルにいくつかの情報があり、PDF エクスポートで InDesign がこの ToUnicode マッピングに変換する可能性がありますか?
それは非 Unicode フォントと関係がありますか? もしそうなら、所有者が別のフォントを選択する必要のない代替手段はありますか?
サンプル ドキュメントの場合、3 つのフォントがあり、すべてにエンコーディングエントリWinAnsiEncoding があり、それらはすべて埋め込みサブセットですが、このような面白いToUnicodeマッピングを持つのは DIN-Medium と DIN-Bold の 2 つだけですが、Helvetica にはToUnicodeがありません。マッピング。だから、どういうわけかフォントに関連しています。正確には言えません。
サンプル ドキュメントの場合の回避策は、フォント ディクショナリからToUnicodeマッピングを削除することです。
たとえば、Java と iText ライブラリを使用すると、次のように実行できます。
PdfReader reader = new PdfReader(INPUT);
for (int i = 1; i <= reader.getXrefSize(); i++)
{
PdfObject obj = reader.getPdfObject(i);
if (obj != null && obj.isDictionary())
{
PdfDictionary dic = (PdfDictionary) obj;
if (PdfName.FONT.equals(dic.getAsName(PdfName.TYPE)))
{
dic.remove(PdfName.TOUNICODE);
}
}
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(OUTPUT));
stamper.close();
reader.close();
この操作の後、Adobe Reader のテキスト抽出により、
PELLE PIÙ BELLA
これは明らかに、サンプル ドキュメントのような状況でのみ機能します。
他のドキュメントに、テキスト抽出のためにそれぞれのToUnicodeマップを必要とするフォントと、上記の問題のあるフォントのようなフォントが混在している場合、Java コードにいくつかの条件を追加して、バグのあるフォント定義。