这确实很有趣。 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,我会感到惊讶。是否可能是 InDesign 文件中有一些信息将 PELLE PIÙ BELLA 标记为 Pelle Più bella,然后 InDesign 在 PDF 导出中将其转换为这个 ToUnicode 映射?
它是否与非 unicode 字体有关,如果是,是否有不需要所有者选择不同字体的替代方法?
如果您的示例文档有三种字体,它们都带有 Encoding 条目 WinAnsiEncoding, 它们都是嵌入的子集,但只有两个具有这样的子集有趣的 ToUnicode 映射,DIN-Medium 和 DIN-Bold,而 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 代码仅删除错误字体定义中的地图。