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

时间:2018-05-03 07:16:12

标签: java scala pdf pdfbox

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

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

1 个答案:

答案 0 :(得分:0)

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 test 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]

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