C#iTextSharp中文字符提取



所以我试图从PDF中提取中文单词。

我使用iTextSharp进行提取,但一旦提取,我发现在提取的字符之间添加了一个间隙/隐藏空间。这是一个巨大的问题,因为它将字符分解为多个空格分隔的字符串,即使它应该只是一个字符串。

我尝试过各种编码,它们都创建了相同的间隙/隐藏/添加空间。这种情况通常发生在包含3个或3个以上汉字的字符串中。

我的目标是提取完整的中文字符串,如下所示。感谢您的任何帮助。

PDF格式的示例数据:A.请B请请C请请请D请请请请E请请请请请F请请请请请请1.请2.请请3.请请请4.请请请请5.请请请请请6.请请请请请请请 请请 请请请 请请请请 请请请请请 请请请请请请

ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
byte[] bytes = Encoding.Unicode.GetBytes(currentText);
byte[] cleanbytes = ScrubBytes(bytes);
char[] chars = Encoding.Unicode.GetChars(bytes);                      
currentText="A 请 B 请请 C 请 请请 D 请 请请请 E 请 请请请 请 F 请 请请请请 请 n1 请 2 请请 3 请请 请 4 请请 请请 5 请请 请请请 6 请请 请请请请 n请 请请 请 请请 请请请 请 请请请请 请 请请 请请请 请 "

如您所见,在C和D中添加了一个间隙,在E和F中插入了2个间隙。

下面列出的内容数据的字符数组:

[0] 65 'A'  char
        [1] 32 ' '  char
        [2] 35831 '请'   char
        [3] 32 ' '  char
        [4] 66 'B'  char
        [5] 32 ' '  char
        [6] 35831 '请'   char
        [7] 35831 '请'   char
        [8] 32 ' '  char
        [9] 67 'C'  char
        [10]    32 ' '  char
        [11]    35831 '请'   char
        [12]    32 ' '  char
        [13]    35831 '请'   char
        [14]    35831 '请'   char
        [15]    32 ' '  char
        [16]    68 'D'  char
        [17]    32 ' '  char
        [18]    35831 '请'   char
        [19]    32 ' '  char
        [20]    35831 '请'   char
        [21]    35831 '请'   char
        [22]    35831 '请'   char
        [23]    32 ' '  char
        [24]    69 'E'  char
        [25]    32 ' '  char
        [26]    35831 '请'   char
        [27]    32 ' '  char
        [28]    35831 '请'   char
        [29]    35831 '请'   char
        [30]    35831 '请'   char
        [31]    32 ' '  char
        [32]    35831 '请'   char
        [33]    32 ' '  char
        [34]    70 'F'  char
        [35]    32 ' '  char
        [36]    35831 '请'   char
        [37]    32 ' '  char
        [38]    35831 '请'   char
        [39]    35831 '请'   char
        [40]    35831 '请'   char
        [41]    35831 '请'   char
        [42]    32 ' '  char
        [43]    35831 '请'   char
        [44]    32 ' '  char
        [45]    10 'n' char
        [46]    49 '1'  char
        [47]    32 ' '  char
        [48]    35831 '请'   char
        [49]    32 ' '  char
        [50]    50 '2'  char
        [51]    32 ' '  char
        [52]    35831 '请'   char
        [53]    35831 '请'   char
        [54]    32 ' '  char
        [55]    51 '3'  char
        [56]    32 ' '  char
        [57]    35831 '请'   char
        [58]    35831 '请'   char
        [59]    32 ' '  char
        [60]    35831 '请'   char
        [61]    32 ' '  char
        [62]    52 '4'  char
        [63]    32 ' '  char
        [64]    35831 '请'   char
        [65]    35831 '请'   char
        [66]    32 ' '  char
        [67]    35831 '请'   char
        [68]    35831 '请'   char
        [69]    32 ' '  char
        [70]    53 '5'  char
        [71]    32 ' '  char
        [72]    35831 '请'   char
        [73]    35831 '请'   char
        [74]    32 ' '  char
        [75]    35831 '请'   char
        [76]    35831 '请'   char
        [77]    35831 '请'   char
        [78]    32 ' '  char
        [79]    54 '6'  char
        [80]    32 ' '  char
        [81]    35831 '请'   char
        [82]    35831 '请'   char
        [83]    32 ' '  char
        [84]    35831 '请'   char
        [85]    35831 '请'   char
        [86]    35831 '请'   char
        [87]    35831 '请'   char
        [88]    32 ' '  char
        [89]    10 'n' char
        [90]    35831 '请'   char
        [91]    32 ' '  char
        [92]    35831 '请'   char
        [93]    35831 '请'   char
        [94]    32 ' '  char
        [95]    35831 '请'   char
        [96]    32 ' '  char
        [97]    35831 '请'   char
        [98]    35831 '请'   char
        [99]    32 ' '  char
        [100]   35831 '请'   char
        [101]   35831 '请'   char
        [102]   35831 '请'   char
        [103]   32 ' '  char
        [104]   35831 '请'   char
        [105]   32 ' '  char
        [106]   35831 '请'   char
        [107]   35831 '请'   char
        [108]   35831 '请'   char
        [109]   35831 '请'   char
        [110]   32 ' '  char
        [111]   35831 '请'   char
        [112]   32 ' '  char
        [113]   35831 '请'   char
        [114]   35831 '请'   char
        [115]   32 ' '  char
        [116]   35831 '请'   char
        [117]   35831 '请'   char
        [118]   35831 '请'   char
        [119]   32 ' '  char
        [120]   35831 '请'   char
        [121]   32 ' '  char

以下字节:

bytes   {byte[244]} byte[]
[0] 65  byte
[1] 0   byte
[2] 32  byte
[3] 0   byte
[4] 247 byte
[5] 139 byte
[6] 32  byte
[7] 0   byte
[8] 66  byte
[9] 0   byte
[10]    32  byte
[11]    0   byte
[12]    247 byte
[13]    139 byte
[14]    247 byte
[15]    139 byte
[16]    32  byte
[17]    0   byte
[18]    67  byte
[19]    0   byte
[20]    32  byte
[21]    0   byte
[22]    247 byte
[23]    139 byte
[24]    32  byte
[25]    0   byte
[26]    247 byte
[27]    139 byte
[28]    247 byte
[29]    139 byte
[30]    32  byte
[31]    0   byte
[32]    68  byte
[33]    0   byte
[34]    32  byte
[35]    0   byte
[36]    247 byte
[37]    139 byte
[38]    32  byte
[39]    0   byte
[40]    247 byte
[41]    139 byte
[42]    247 byte
[43]    139 byte
[44]    247 byte
[45]    139 byte
[46]    32  byte
[47]    0   byte
[48]    69  byte
[49]    0   byte
[50]    32  byte
[51]    0   byte
[52]    247 byte
[53]    139 byte
[54]    32  byte
[55]    0   byte
[56]    247 byte
[57]    139 byte
[58]    247 byte
[59]    139 byte
[60]    247 byte
[61]    139 byte
[62]    32  byte
[63]    0   byte
[64]    247 byte
[65]    139 byte
[66]    32  byte
[67]    0   byte
[68]    70  byte
[69]    0   byte
[70]    32  byte
[71]    0   byte
[72]    247 byte
[73]    139 byte
[74]    32  byte
[75]    0   byte
[76]    247 byte
[77]    139 byte
[78]    247 byte
[79]    139 byte
[80]    247 byte
[81]    139 byte
[82]    247 byte
[83]    139 byte
[84]    32  byte
[85]    0   byte
[86]    247 byte
[87]    139 byte
[88]    32  byte
[89]    0   byte
[90]    10  byte
[91]    0   byte
[92]    49  byte
[93]    0   byte
[94]    32  byte
[95]    0   byte
[96]    247 byte
[97]    139 byte
[98]    32  byte
[99]    0   byte
[100]   50  byte
[101]   0   byte
[102]   32  byte
[103]   0   byte
[104]   247 byte
[105]   139 byte
[106]   247 byte
[107]   139 byte
[108]   32  byte
[109]   0   byte
[110]   51  byte
[111]   0   byte
[112]   32  byte
[113]   0   byte
[114]   247 byte
[115]   139 byte
[116]   247 byte
[117]   139 byte
[118]   32  byte
[119]   0   byte
[120]   247 byte
[121]   139 byte
[122]   32  byte
[123]   0   byte
[124]   52  byte
[125]   0   byte
[126]   32  byte
[127]   0   byte
[128]   247 byte
[129]   139 byte
[130]   247 byte
[131]   139 byte
[132]   32  byte
[133]   0   byte
[134]   247 byte
[135]   139 byte
[136]   247 byte
[137]   139 byte
[138]   32  byte
[139]   0   byte
[140]   53  byte
[141]   0   byte
[142]   32  byte
[143]   0   byte
[144]   247 byte
[145]   139 byte
[146]   247 byte
[147]   139 byte
[148]   32  byte
[149]   0   byte
[150]   247 byte
[151]   139 byte
[152]   247 byte
[153]   139 byte
[154]   247 byte
[155]   139 byte
[156]   32  byte
[157]   0   byte
[158]   54  byte
[159]   0   byte
[160]   32  byte
[161]   0   byte
[162]   247 byte
[163]   139 byte
[164]   247 byte
[165]   139 byte
[166]   32  byte
[167]   0   byte
[168]   247 byte
[169]   139 byte
[170]   247 byte
[171]   139 byte
[172]   247 byte
[173]   139 byte
[174]   247 byte
[175]   139 byte
[176]   32  byte
[177]   0   byte
[178]   10  byte
[179]   0   byte
[180]   247 byte
[181]   139 byte
[182]   32  byte
[183]   0   byte
[184]   247 byte
[185]   139 byte
[186]   247 byte
[187]   139 byte
[188]   32  byte
[189]   0   byte
[190]   247 byte
[191]   139 byte
[192]   32  byte
[193]   0   byte
[194]   247 byte
[195]   139 byte
[196]   247 byte
[197]   139 byte
[198]   32  byte
[199]   0   byte
[200]   247 byte
[201]   139 byte
[202]   247 byte
[203]   139 byte
[204]   247 byte
[205]   139 byte
[206]   32  byte
[207]   0   byte
[208]   247 byte
[209]   139 byte
[210]   32  byte
[211]   0   byte
[212]   247 byte
[213]   139 byte
[214]   247 byte
[215]   139 byte
[216]   247 byte
[217]   139 byte
[218]   247 byte
[219]   139 byte
[220]   32  byte
[221]   0   byte
[222]   247 byte
[223]   139 byte
[224]   32  byte
[225]   0   byte
[226]   247 byte
[227]   139 byte
[228]   247 byte
[229]   139 byte
[230]   32  byte
[231]   0   byte
[232]   247 byte
[233]   139 byte
[234]   247 byte
[235]   139 byte
[236]   247 byte
[237]   139 byte
[238]   32  byte
[239]   0   byte
[240]   247 byte
[241]   139 byte
[242]   32  byte
[243]   0   byte

获取结果并使用regex replace去掉任何空白(制表符、空格等),例如:

string text = "A 请 B 请请 C 请 请请 D 请 请请请 E 请 请请请 请 F 请";
Console.WriteLine (Regex.Replace(text, @"s+", string.Empty));
// Result printed out
// A请B请请C请请请D请请请请E请请请请请F请

这个问题(和答案)有点旧,但我将在这里添加我的解决方案。

在我2021年在这里使用的iTextSharp版本(5.5.13.2)中,使用PdfTextExtractor.GetTextFromPage();甚至不再有效。我正在处理一个日语PDF,它提取的只是换行符(/n)和项目符号。

我能够使用这个代码成功地提取文本(与原始问题中的前2行代码相同):

ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);

唯一的问题是,我不得不将PDF中使用的字体更改为MeirioUI字体。如果您使用Meiryo UI字体,iTextSharp的GetTextFromPage将成功提取汉字(以及日语汉字、片假名和平假名)。

最新更新