我使用此代码使用iTextSharp读取pdf内容.当内容是英语时它工作正常,但是当内容是波斯语或阿拉伯语时它不起作用
结果是这样的:
这里是非英语PDF样本用于测试.
ÙŽÙ>ناÙÙ"بÙÙØ·Ø«ÛŒØ¿ÛŒÙ>Ù~Ø²ØØØ§ÙÙ>ÙØÙ"Ù,Ù>Ù...ØÛÛÙ"بٕس©Karl Seguin foppersian.codeplex. com www.codebetter.com 1 1ÙÙ"ب~طثَÙ>نایؿیÙ>Ù〜
Run Code Online (Sandbox Code Playgroud)همانرب لوصا یسیون مرن دیلوت رتهب Ø±Ø§Ø²ÙØ§
解决办法是什么 ?
public string ReadPdfFile(string fileName)
{
StringBuilder text = new StringBuilder();
if (File.Exists(fileName))
{
PdfReader pdfReader = new PdfReader(fileName);
for (int page = 1; page <= pdfReader.NumberOfPages; page++)
{
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText)));
text.Append(currentText);
pdfReader.Close();
}
}
return text.ToString();
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*aas 13
在.Net中,一旦你有一个字符串,你就有一个字符串,它总是 Unicode .实际的内存实现是UTF-16,但这并不重要.永远不会将字符串分解为字节,并尝试将其重新解释为不同的编码并将其作为字符串重新编写,因为这没有意义,并且几乎总是会失败.
你的问题是这一行:
currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText)));
Run Code Online (Sandbox Code Playgroud)
我将把它分成两行来说明:
byte[] bytes = Encoding.UTF8.GetBytes("?"); //bytes now holds 0xDB8C
byte[] converted = Encoding.Convert(Encoding.Default, Encoding.UTF8, bytes);//converted now holds 0xC39BC592
string final = Encoding.UTF8.GetString(converted);//final now holds ی
Run Code Online (Sandbox Code Playgroud)
代码将混淆127 ASCII屏障之上的任何内容.删除重新编码行,你应该很好.
注意,完全有可能无论什么创建一个字符串都不正确,这实际上并不常见.但是你要解决这个问题之前就变成了string,在byte级别.
编辑
代码应该与您的代码完全相同,只是应该删除一行.此外,无论您使用什么来显示文本,请确保它支持Unicode.另外,正如@kuujinbo所说,请确保您使用的是最近版本的iTextSharp.我用5.2.0.0测试了这个.
public string ReadPdfFile(string fileName) {
StringBuilder text = new StringBuilder();
if (File.Exists(fileName)) {
PdfReader pdfReader = new PdfReader(fileName);
for (int page = 1; page <= pdfReader.NumberOfPages; page++) {
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
text.Append(currentText);
}
pdfReader.Close();
}
return text.ToString();
}
Run Code Online (Sandbox Code Playgroud)
编辑2
上面的代码修复了编码问题,但没有修复字符串本身的顺序.不幸的是,这个问题似乎是在PDF级别本身.
因此,在这种从右到左书写系统中显示文本需要单独定位每个字形(这是繁琐且昂贵的)或表示带有显示字符串的文本(参见9.2,"字体的组织和使用"),其字符代码在相反的顺序.
PDF 2008 Spec - 14.8.2.3.3 - 反向显示字符串
当重新排序如上所述的字符串时,内容是(如果我理解正确的规范)应该使用"标记内容"部分,BMC.但是,我查看和生成的少量示例PDF似乎并没有实际执行此操作.我绝对可能错在这一部分因为这不是我的专长所以你不得不四处寻找.