如何在 iText7/iText7.pdfhtml 的行首修复 CJK 标点符号

两木式

我在使用 iText7/iText7.pdfhtml 将 HTML 字符串转换为 PDF 文件时遇到了这个问题。我发现了一些类似的问题,例如:

但是这些问题的解决方案是针对 iText5 的,我在我的应用程序中尝试了这些解决方案,但最终失败了。我的代码是这样的:

IList<IElement> elements = HtmlConverter.ConvertToElements(pdfHtmlString, properties);
Document document = new Document(pdfDoc);
CJKSplitCharacters splitCharacters = new CJKSplitCharacters();
document.SetFontProvider(fp);
document.SetSplitCharacters(splitCharacters);
document.SetProperty(Property.SPLIT_CHARACTERS, splitCharacters);
foreach (IElement e in elements)
{
     try
     {
          document.Add((AreaBreak)e);
     }
     catch
     {
          document.Add((IBlockElement)e);
     }
}

代码CJKSplitCharacters

public class CJKSplitCharacters : ISplitCharacters
{
    // line of text cannot start or end with this character
    static char u2060 = '\u2060';   //       - ZERO WIDTH NO BREAK SPACE

    // a line of text cannot start with any following characters in NOT_BEGIN_CHARACTERS[]
    static char[] NOT_BEGIN_CHARACTERS = new char[]{u30fb, u2022, uff65, u300d, uff09, u0021, u0025, u0029, u002c,
      u002e, u003f, u005d, u007d, uff61, uff63, uff64, uff67, uff68, uff69, uff6a, uff6b, uff6c, uff6d, uff6e,
      uff6f, uff70, uff9e, uff9f, u3001, u3002, uff0c, uff0e, uff1a, uff1b, uff1f, uff01, u309b, u309c, u30fd,
      u30fe, u309d, u309e, u3005, u30fc, u2019, u201d, u3015, uff3d, uff5d, u3009, u300b, u300f, u3011, u00b0,
      u2032, u2033, u2103, u00a2, uff05, u2030, u3041, u3043, u3045, u3047, u3049, u3063, u3083, u3085, u3087,
      u308e, u30a1, u30a3, u30a5, u30a7, u30a9, u30c3, u30e3, u30e5, u30e7, u30ee, u30f5, u30f6, u2060};

    // a line of text cannot end with any following characters in NOT_ENDING_CHARACTERS[]
    static char[] NOT_ENDING_CHARACTERS = new char[]{u0024, u0028, u005b, u007b, u00a3, u00a5, u201c, u2018, u3008,
      u300a, u300c, u300e, u3010, u3014, uff62, uff08, uff3b, uff5b, uffe5, uff04, u2060};

    /// <summary>
    /// 
    /// </summary>
    /// <param name="text"></param>
    /// <param name="glyphPos"></param>
    /// <returns></returns>
    public bool IsSplitCharacter(GlyphLine text, int glyphPos)
    {
        if (!text.Get(glyphPos).HasValidUnicode())
        {
            return false;
        }
        int charCode = text.Get(glyphPos).GetUnicode();

        if (NOT_BEGIN_CHARACTERS.Contains((char)charCode))
        {
            return false;
        }
        return new DefaultSplitCharacters().IsSplitCharacter(text, glyphPos);
    }

我的源代码在这里:源代码

我的问题如下:

iText7/iText7.pdfhtml中的CJK标点问题

非常感谢您的帮助!

阿列克谢·苏巴赫

我想问题出在IsSplitCharacter方法实现上。您没有使用NOT_ENDING_CHARACTERS并且只使用NOT_BEGIN_CHARACTERS.

尽管由于缺少源字符串数据而无法重现您的示例(这意味着我尚未测试我的方法),但我认为您应该实现相关方法的方式如下:

public bool IsSplitCharacter(GlyphLine text, int glyphPos)
{
    if (!text.Get(glyphPos).HasValidUnicode())
    {
        return false;
    }
    int charCode = text.Get(glyphPos).GetUnicode();

    if (NOT_ENDING_CHARACTERS.Contains((char)charCode))
    {
        return false;
    }

    // Look ahead for the next non-whitespace character and check it not to be in NOT_BEGIN_CHARACTERS list
    for (int i = 1; glyphPos + i < text.end; i++)
    {
        if (!text.Get(glyphPos + i).HasValidUnicode())
        {
            break;
        }
        if (!TextUtil.isSpaceOrWhitespace(text.Get(glyphPos + i)))
        {
            if (NOT_BEGIN_CHARACTERS.Contains(text.Get(glyphPos + i).GetUnicode()))
            {
                return false;
            }
            break;
        }
    }

    return new DefaultSplitCharacters().IsSplitCharacter(text, glyphPos);
}

另请注意,您的实现不是很有效,您应该用 HashSet 替换 char 数组以加速Contains查找,现在查找与数组的大小成线性关系。此外,不是DefaultSplitCharacters每次都在中创建实例IsSplitCharacter,您应该将它作为CJKSplitCharacters类中的一个字段创建一次并重用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用 iText 7 设置卢布符号?

来自分类Dev

如果所有行仅包含标点符号,如何检查和删除熊猫列?

来自分类Dev

Stanford Parser:如何包括标点符号?

来自分类Dev

如何暂时忽略标点符号?蟒蛇

来自分类Dev

如何分割句子,包括标点符号

来自分类Dev

如何从文本中删除标点符号?

来自分类Dev

如何暂时忽略标点符号?Python

来自分类Dev

Stanford Parser:如何包括标点符号?

来自分类Dev

如何找到标点符号遗忘的旁白

来自分类Dev

如何消除jfreechart上的标点符号

来自分类Dev

Itext7 - pdfHTML - Document SetMargins 方法不起作用

来自分类Dev

如何使用sed全局删除除某些标点符号以外的所有标点符号?

来自分类Dev

如何在HTML / CSS中悬挂标点符号

来自分类Dev

如何在本地键盘上输入标点符号?

来自分类Dev

如何在维护URL的同时去掉标点符号?

来自分类Dev

如何在字符串周围添加标点符号?

来自分类Dev

如何在Windows 7上设置默认的CJK字体?

来自分类Dev

如何在Android上的XMLWorker中的iText中使用CJK字体?

来自分类Dev

打印所有不包含标点符号的行

来自分类Dev

如何删除句子中的所有标点符号?

来自分类Dev

如何从txt中删除标点符号(英语)?

来自分类Dev

R如何使用TermDocumentMatrix()保持标点符号

来自分类Dev

JS&Regex:如何正确替换标点符号?

来自分类Dev

如何停止书本重新排序标点符号?

来自分类Dev

如何从DBPedia检索带有标点符号的人名?

来自分类Dev

如何创建自己的标点符号列表以在python中删除

来自分类Dev

如何使用grep忽略标点符号的字符串?

来自分类Dev

如何使用Tokenizer函数tensorflow对标点符号化

来自分类Dev

如何用HTML实体替换标点符号

Related 相关文章

  1. 1

    如何使用 iText 7 设置卢布符号?

  2. 2

    如果所有行仅包含标点符号,如何检查和删除熊猫列?

  3. 3

    Stanford Parser:如何包括标点符号?

  4. 4

    如何暂时忽略标点符号?蟒蛇

  5. 5

    如何分割句子,包括标点符号

  6. 6

    如何从文本中删除标点符号?

  7. 7

    如何暂时忽略标点符号?Python

  8. 8

    Stanford Parser:如何包括标点符号?

  9. 9

    如何找到标点符号遗忘的旁白

  10. 10

    如何消除jfreechart上的标点符号

  11. 11

    Itext7 - pdfHTML - Document SetMargins 方法不起作用

  12. 12

    如何使用sed全局删除除某些标点符号以外的所有标点符号?

  13. 13

    如何在HTML / CSS中悬挂标点符号

  14. 14

    如何在本地键盘上输入标点符号?

  15. 15

    如何在维护URL的同时去掉标点符号?

  16. 16

    如何在字符串周围添加标点符号?

  17. 17

    如何在Windows 7上设置默认的CJK字体?

  18. 18

    如何在Android上的XMLWorker中的iText中使用CJK字体?

  19. 19

    打印所有不包含标点符号的行

  20. 20

    如何删除句子中的所有标点符号?

  21. 21

    如何从txt中删除标点符号(英语)?

  22. 22

    R如何使用TermDocumentMatrix()保持标点符号

  23. 23

    JS&Regex:如何正确替换标点符号?

  24. 24

    如何停止书本重新排序标点符号?

  25. 25

    如何从DBPedia检索带有标点符号的人名?

  26. 26

    如何创建自己的标点符号列表以在python中删除

  27. 27

    如何使用grep忽略标点符号的字符串?

  28. 28

    如何使用Tokenizer函数tensorflow对标点符号化

  29. 29

    如何用HTML实体替换标点符号

热门标签

归档