如何使用 java/scala 获取 pdf 文件的字形?

How to get the glyphs of a pdf file using java/scala?

我在梵城语中有一个 pdf 文件。一些字形以不正确的方式映射。我想从 pdf 文件中提取所有这些字形并将它们映射到正确的 unicode。我如何提取 pdf 文件的字形?

https://1drv.ms/b/s!AmHcFaD-gMGyhipy6feWmHK7Ea-P

OP 在评论中澄清说,他本质上想要字形 ID,而不是 ToUnicode 映射到的字符。由于所讨论的字体具有 Identity-H 编码,字形 ID 与字符代码一致。

文本字形的字符代码包含在文本剥离器处理的 TextPosition 个对象中。因此,您必须在仍然具有这些 TextPosition 对象的方法中将自己的代码添加到剥离器。

最后一个符合此条件的方法是 writeString(String, List<TextPosition>),它默认忽略第二个参数并使用第一个字符调用 writeString(String)

相反,您不能忽略第二个参数,而是要检查它,例如像这样:

PDDocument document = PDDocument.load(resource);
PDFTextStripper stripper = new PDFTextStripper() {
    @Override
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
        for (TextPosition textPosition : textPositions) {
            writeString(String.format("%s%s", textPosition.getUnicode(), Arrays.toString(textPosition.getCharacterCodes())));
        }
    }
};
//stripper.setSortByPosition(true);
String text = stripper.getText(document);

System.out.printf("\n*\n* singNepChar.pdf\n*\n%s\n", text);

(ExtractCharacterCodes 测试 testExtractFromSingNepChar)

此示例仅输出每个提取的字符以及提取它的字符代码。您可以改为对给定数据进行任何评估,例如基于字符代码和您可能拥有的其他信息的 Unicode 映射。

您实际上掌握了更多信息,特别是 TextPosition 还包含文本的字体对象(通过 getFont)。由于字符代码可能因字体而异,因此此信息可能对您很重要。

对于示例文档,输出为

*
* singNepChar.pdf
*
क[1399] [3]ख[1400] [3]ग[1401] [3]घ[1402] [3]ङ[1403] [3]च[1404] [3]छ[1405] [3]ज[1406] [3]झ[1407] [3]ञ[1408] [3]ट[1409] [3]ठ[1410] [3]ड[1411] [3]ढ[1412] [3]ण[1413] [3]त[1414] [3]थ[1415] [3]द[1416] [3]ध[1417] [3]न[1418] [3]प[1420] [3]फ[1421] [3]ब[1422] [3]भ[1423] [3]म[1424] [3]य[1425] [3]र[1426] [3]ल[1428] [3]व[1431] [3]श[1432] [3]ष[1433] [3]स[1434] [3]ह[1435] [3]क्ष[6979] [3]त्र[7074] [3]ज्ञ[6980] [32]
ऄ[1383] [3]अ[1384] [3]आ[1385] [3]इ[1386] [3]ई[1387] [3]उ[1388] [3]ऊ[1389] [3]ए[1393] [3]ऐ[1394] [3] [3]ओ[1397] [3]औ[1398] [32]ऄ[1383]ं[1381] [3]ऄ[1383]ः[1382] [32]
 [32]
 [32]
 [32]
 [32]
 [32]
 [32]
 [32]
 [32]

(注意,我的输出是十进制的,而您评论中的数据是十六进制的。)