gpt4 book ai didi

c# - 在 C# 中使用 iTextSharp 阅读 pdf 内容

转载 作者:太空狗 更新时间:2023-10-29 22:16:49 27 4
gpt4 key购买 nike

我使用此代码通过 iTextSharp 阅读 pdf 内容。当内容是英语时它工作正常但当内容是波斯语或阿拉伯语时它不起作用
结果是这样的:
Here是用于测试的示例非英语 PDF。

َٛنا Ùٔب٘طث یؿیٛ٘ زؾا ÙÙ›ÙØ­Ù” قٛمح یٔبٕس © Karl Seguin foppersian.codeplex.com www.codebetter.com 1 1 Ùٔب٘طث َٛنا یؿیٛ٘

همانرب لوصا یسیون  مرن دیلوت رتهب رازÙا

解决方案是什么?

  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();
}

最佳答案

在 .Net 中,一旦你有了一个字符串,你就有了一个字符串,而且它是 Unicode,总是。实际的内存中实现是 UTF-16,但这并不重要。永远、永远、永远不要将字符串分解为字节并尝试将其重新解释为不同的编码并将其重新作为字符串,因为这没有意义并且几乎总是会失败。

你的问题是这一行:

currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.UTF8.GetBytes(currentText)));

我将把它分成几行来说明:

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 ی

代码会混淆超过 127 个 ASCII 码的任何内容。删除重新编码行,你应该没问题。

旁注,创建字符串的任何内容都完全有可能不正确,这实际上并不少见。但是您需要在 它变成 byte 级别的 string 之前解决这个问题。

编辑

代码应该与上面的代码完全相同,除了应该删除一行。此外,无论您使用什么来显示文本,请确保它支持 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();
}

编辑 2

上面的代码修复了编码问题,但没有修复字符串本身的顺序。不幸的是,这个问题似乎出在 PDF 级别本身。

Consequently, showing text in such right-to-left writing systems requires either positioning each glyph individually (which is tedious and costly) or representing text with show strings (see 9.2, “Organization and Use of Fonts”) whose character codes are given in reverse order.

PDF 2008 规范 - 14.8.2.3.3 - 倒序显示字符串

当重新排序上述字符串时,内容(如果我正确理解规范)应该使用“标记内容”部分,BMC。但是,我查看和生成的少数示例 PDF 似乎并没有实际执行此操作。我在这部分绝对可能是错的,因为这不是我的专长,所以你必须多花点时间。

关于c# - 在 C# 中使用 iTextSharp 阅读 pdf 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10185643/

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