0

我想将 pdf 转换为文本格式并为此使用 itextsharp dll 这是我的代码,它将我的 pdf 转换为字符串格式,但在某些 pdf 的情况下,此代码无法正常转换,例如当我传递 PDF 文件并假设在 pdf 标题中有像 Microsoft windows 这样的名称,然后它像 MMMiicccrrossofft WWiiiindooowsss 那样转换它,并假设有像 xyx@gmail.com 这样的电子邮件 ID,而不是像 xxxyyyzzzz@@@ggggmaillll.com 这样的结果。谁能告诉我为什么在某些情况下会发生这种情况。

public static string ReadPDFFile(string pdfFile)
    {
        StringBuilder text = new StringBuilder();
        if (File.Exists(pdfFile))
        {
            PdfReader reader = new PdfReader(pdfFile);
            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                PdfReader pdfreader = new PdfReader(pdfFile);
                string currenttext = PdfTextExtractor.GetTextFromPage(pdfreader, i, strategy);
                currenttext = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currenttext)));                
                text.Append(currenttext);
            }
            try
            {
                reader.Close();
            }
            catch
            {
            }
        }
        return Convert.ToString(text);
    }
4

1 回答 1

0

当我传递 PDF 文件并假设在 pdf 标题中有像 Microsoft windows 这样的名称然后它像 MMMiicccrrossofft WWiiiindooowsss 那样转换它,并假设有像 xyx@gmail.com 这样的电子邮件 ID,而不是像 xxxyyyzzzz@@@ggggmaillll.com 这样的结果。谁能告诉我为什么在某些情况下会发生这种情况。

您提到该问题尤其发生在标题或电子邮件地址等特殊文本部分。我假设这些文本部分打印得有些粗体。

如此粗体部分的字母被多次提取的原因是在 PDF 中很可能存在这些字母的多个副本!为了在不实际使用粗体字体的情况下实现粗体效果,一些程序会以较小的位移多次打印相同的字符。这通常被称为“穷人的大胆”。

其他效果,例如一些阴影,可能会使用相同的基本技术,只是使用不同的颜色,并且可能在相同角色的副本之间使用稍大的位移。

要将相同字符的多个副本提取为单个副本,您必须创建可识别这些技术的扩展文本提取策略。您可以根据现有策略的代码SimpleTextExtractionStrategyLocationTextExtractionStrategy通过检查相同字符是否在几乎相同的坐标处多次出现来创建它们。

于 2013-09-10T09:16:39.710 回答