在C#中将PDF文件转换为文本

9
我需要将一个 .pdf 文件转换成 .txt 文件,如何在 C# 中实现?
6个回答

5

4

Ghostscript可以满足您的需求。下面是从pdf文件中提取文本到txt文件的命令(您可以从命令行运行它来测试它是否适用于您):

gswin32c.exe -q -dNODISPLAY -dSAFER -dDELAYBIND -dWRITESYSTEMDICT -dSIMPLE -c save -f ps2ascii.ps "test.pdf" -c quit >"test.txt"

请查看这里:codeproject:使用Ghostscript API将PDF转换为图像,了解如何在C#中使用ghostscript的详细信息。


谢谢! 它能运行,但是有一个问题,它没有保存到txt文件中,只是创建了一个空的文件。为什么会这样呢? 我像这样运行它: C:> C:\ gswin32.exe -q -dNODISPLAY -dSAFER -dDELAYBIND -dWRITESYSTEMDICT -d-c save -f ps2ascii.ps "C:\ New Folder \ 2 \ test.pdf" -c quit >“c:\ test.txt” - aharon
如果您像这样运行它:gswin32.exe "C:\New Folder\2\test.pdf",它会显示文件吗?另外,您可能希望尝试从gs的bin文件夹中运行它,例如:C:\ Program Files \ gs \ gs8.64 \ bin> gswin32c.exe ....无论如何,如果gs找不到\解析您的文件,它应该会给出错误,请在此处发布它,如果仍然无法转换您的文件。 - serge_gubenko
它必须在Windows上运行,并且对我来说运行良好;解析PDF文件可能会出现问题,但通常您会从gs收到错误消息,并说明缺少或损坏了什么;您能否将您的PDF文件发布在文件共享服务上,以便我可以尝试转换它? - serge_gubenko
这是我想要转换的文件链接。 我认为您不会有问题来转换它,我成功地将其转换了,但问题是它没有保存到txt文件中。 这是命令: gswin32.exe -q -dNODISPLAY -dSAFER -dDELAYBIND -dWRITESYSTEMDICT -dSIMPLE -c save -f ps2ascii.ps "c:\test.pdf" > "c:\test.txt" - aharon
哇!!!它起作用了!!!谢谢!!!但是还有一个小问题,如果有粗体字,那么在某些PDF文件中,它们无法正确解析,单词会被切断或每个单词都分开。有什么办法可以解决吗?我上传了一个示例文件。您可以在第一行清楚地看到它,但在其他行(粗体行)中也有一些类似的单词:http://www.megafileupload.com/en/file/170969/test-txt.html 另外一个问题,我需要转换15000个PDF文件(为我的项目),如果我在C#中循环并从cmd运行此程序,这样做是否可以? - aharon
显示剩余9条评论

1
将PDF转换为文本的概念并不是非常直观,你不会看到有人在这里发布可以直接将PDF转换为文本的代码。因此,你现在最好使用一个能够完成这项工作的库... 一个很好的选择是PDFBox,你可以在谷歌上搜索它。你可能会发现它是用Java编写的,但幸运的是你可以使用IKVM将其转换为.Net...

1

我已经尝试过这个,@Don提供的链接是更好的转换。 - Valamas

0

Docotic.Pdf library可以从PDF文件中提取文本(无论格式如何)。

以下是一个示例代码,展示了如何从PDF文件中提取格式化文本并将其保存到另一个文件中。

public static void ExtractFormattedText(string pdfFile, string textFile)
{
    using (PdfDocument doc = new PdfDocument(pdfFile))
    {
        string text = doc.GetTextWithFormatting();
        File.WriteAllText(textFile, text);
    }
}

此外,我们网站上还有一篇文章介绍了其他从PDF文件中提取文本的选项(链接)

声明:我是Bit Miracle公司的供应商。


但这只是一个简单的转换。我需要将文章转换为PDF文件,而这些PDF文件具有不同的布局... - aharon

-2
    public void PDF_TEXT()
    {
        richTextBox1.Text =  string.Empty;

        ReadPdfFile(@"C:\Myfile.pdf");  //read pdf file from location
    }


    public void ReadPdfFile(string fileName)
    {

 string strText = string.Empty;
 StringBuilder text = new StringBuilder();
   try
    {
    PdfReader reader = new PdfReader((string)fileName);
    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();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        richTextBox1.Text = text.ToString();

    }



    private void Save_TextFile_Click(object sender, EventArgs e)
    {
        SaveFileDialog sfd = new SaveFileDialog();

        DialogResult messageResult = MessageBox.Show("Save this file into Text?", "Text File", MessageBoxButtons.OKCancel);

        if (messageResult == DialogResult.Cancel)
        {

        }
        else
        {
            sfd.Title = "Save As Textfile";
            sfd.InitialDirectory = @"C:\";
            sfd.Filter = "TextDocuments|*.txt";


            if (sfd.ShowDialog() == DialogResult.OK)
            {
                if (richTextBox1.Text != "")
                {
                    richTextBox1.SaveFile(sfd.FileName, RichTextBoxStreamType.PlainText);
                    richTextBox1.Text = "";
                    MessageBox.Show("Text Saved Succesfully", "Text File");

                }
                else
                {
                    MessageBox.Show("Please Upload Your Pdf", "Text File",
                    MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
                }

            }

        }

    }

2
仅仅粘贴代码并不是有帮助的。 - mkl
我认为这里没有太多需要描述的困难事情。 - shuvo sarker
7
我认为这里没有太多需要描述的难点。- 其实,您的代码甚至无法编译,简单的原因是您没有提及依赖项。问题和您的回答都没有提到iTextSharp。任何不认识相关类的人都会立即迷失方向。此外,您的代码中还有一些不必要的元素。如果OP想创建一个命令行应用程序,GUI元素事件监听器是不合适的。好的例子可以看一下@Bobrovsky的回答,他提到了库的依赖关系并且只呈现了关键代码。 - mkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接