gpt4 book ai didi

java - 尝试从 pdf 中提取字形 ID 时缺少一些字形 ID

转载 作者:行者123 更新时间:2023-12-02 11:10:10 28 4
gpt4 key购买 nike

由于 Devanagiri 字形映射到 unicode 字符不正确,我使用以下代码来提取字形 ID 并形成我自己的映射,以将 ID 映射到正确的 unicode 字符。

public class ExtractCharacterCodes {
public static void testExtractFromSingNepChar() throws IOException {
PDDocument document = PDDocument.load(new File("C:/PageSeparator/pattern3.pdf"));
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);
}

public static void main(String[] args) throws IOException {
ExtractCharacterCodes.testExtractFromSingNepChar();
}

}

应用此 pdf 时 Nepali pdf

我得到以下内容:स[1434]नु[1418] [3]त[1414]स्[7021]क[1399]र[1426]ी[1440]क[1399]ा[1438] [3]म[1424]खु्[6990]य[1425] [3]अ[1383]ा[4285]ा[1438]र[1426]ो[1451]प[1420]ी[1440] [3]' [39]ग[1401]ो[1451]रे[1426]'[39][32]
〔1399〕〔1438〕〔1410〕〔1424〕〔1438〕〔1411〕〔7301〕〔1399〕〔1451〕〔3〕〔1401〕〔1452〕〔1426〕 ]ी[1440]घ[1402]ा[1438]ट[1409]ब[1422]ा[1438]ट[1409] [3]प[1420]क्र[7059]ा[1438]उ[1387] [32 ]
ज[1406]न[1418]क[1399]र[1426]ा[1438]ज[1406] [3]स[1434]ा[1438]प[1420]क[1399]ो[1451]ट[1409 ]ा[1438]त[1414]स्[1439]स्[7021]ब[1422]र[1426] [3]:[29][3]क[1399]स्[1439]ि[1431]न[1418 ] [3]अ[1383]स्[1439]ध[1417]क[1399]ा[1438]र[1426]ी[1440][32]|[124][32]ज[1406]े[1447] ष्ठ[7399] [3]
८[1481],[44] [32]२[1475]०[1473]७[1480]५[1478] [32]
等等

如您所见,我有一个字符串“सुन”,被分隔为स[1434]、नु[1418]。我开始制作自己的字形 ID 到字符的映射,但在这种情况下,字形 ID 丢失了。应该是स[1434]、न[1441]、ु[1418]。我如何得到这个?

最佳答案

原因是 PDFTextStripper 不仅将从底层解析器检索到的 TextPosition 对象组织成行并添加隐含空格,它还对在转发到writeString之前。特别是它

  • 抑制重复的重叠字形:创建穷人的粗体效果的一种方法是以微小的偏移量绘制两次字形,并且这些重复的字形将被抑制;还有它
  • 将包含变音符号的 TextPosition 对象与包含相应基本字形的 TextPosition 合并为表示组合 Unicode 代码点的 TextPosition。<

可以使用 PDFTextStripper.setSuppressDuplicateOverlappingText(false) 禁用前一个处理步骤,但后者不能。

您观察到的效果是由于后一个处理步骤造成的。

如果您想在不进行任何预处理的情况下获取字形,即不进行重复抑制和变音符号合并,但也不将它们组织成行并添加隐含空格,则可以覆盖 processTextPosition 而不是 writeString:

PDDocument document = PDDocument.load(resource);
PDFTextStripper stripper = new PDFTextStripper() {
@Override
protected void processTextPosition(TextPosition textPosition) {
try {
writeString(String.format("%s%s", textPosition.getUnicode(), Arrays.toString(textPosition.getCharacterCodes())));
} catch (IOException e) {
e.printStackTrace();
}
}
};

String text = stripper.getText(document);

( ExtractCharacterCodes 测试 testExtractFromPattern3)

示例文档现在的结果是

स[1434]ु[1441]न[1418] [3]त[1414]स्[7021]क[1399]र[1426]ी[1440]क[1399]ा[1438] [3]...

如果您仍然希望 PDFTextStripper 将字形组织成行并添加隐含空格,则必须修补该类(或您自己的副本)并在其 processTextPosition 实现通过替换禁用变音符号合并

// test if we overlap the previous entry.
// Note that we are making an assumption that we need to only look back
// one TextPosition to find what we are overlapping.
// This may not always be true. */
TextPosition previousTextPosition = textList.get(textList.size() - 1);
if (text.isDiacritic() && previousTextPosition.contains(text))
{
previousTextPosition.mergeDiacritic(text);
}
// If the previous TextPosition was the diacritic, merge it into this
// one and remove it from the list.
else if (previousTextPosition.isDiacritic() && text.contains(previousTextPosition))
{
text.mergeDiacritic(previousTextPosition);
textList.remove(textList.size() - 1);
textList.add(text);
}
else
{
textList.add(text);
}

通过一个简单的

textList.add(text);
<小时/>

顺便说一句,您的测试文件在 PDFBox 确定基本字形以合并变音符号时出现错误:“स[1434]ु[1441]न[1418]”应呈现为“सुन” ”,即元音符号 u“ु”与字母 sa“स”组合,但 PDFBox 将其与后续字母 na“न”组合为“सनु”。

原因是它通过其来源确定了要组合变音符号的字母,这里确实在后一个字母 na“न”的范围内,但由于元音符号字形在其来源之前呈现 (它绘制在具有负 x 坐标的区域中),PDFBox 确定错误的关联:

SA-U-NA

关于java - 尝试从 pdf 中提取字形 ID 时缺少一些字形 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50664162/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com