这确实很有趣。 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 子集)我们看到它声称使用WinAnsi编码这也表明将页面流中的这些字符代码解释为大写字母
但字体也有一个转Unicode映射,这个映射映射
<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文件中有一些信息是哪个标签佩尔·皮乌·贝拉 as 佩尔·皮乌·贝拉PDF 导出中的哪个 InDesign 会转换为此 ToUnicode 映射?
它是否与非 unicode 字体有关,如果是,是否有其他方法不需要所有者选择不同的字体?
如果您的示例文档有三种字体,它们都带有一个Encoding entry WinAnsi编码,它们都是嵌入式子集,但只有两个有如此有趣的转Unicode映射,DIN-Medium 和 DIN-Bold,而 Helvetica 没有转Unicode映射。所以它在某种程度上与字体有关。具体如何我也说不上来。
解决方法如果您的样本文档是remove the 转Unicode从字体字典映射。
例如,使用 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
显然,这仅适用于示例文档中的情况。
如果在您的其他文档中存在混合字体,其中一些字体需要各自的字体转Unicode地图用于文本提取,而其他字体就像上面的问题字体一样,您可能需要向 Java 代码添加一些额外的条件,以仅删除有问题的字体定义中的地图。