【问题标题】:How to read a PDF file line by line in c#?如何在 C# 中逐行读取 PDF 文件?
【发布时间】:2014-08-21 11:08:57
【问题描述】:

在我的 Windows 8 应用程序中,我想逐行阅读 PDF,然后我想分配一个字符串数组。我该怎么做?

    public StringBuilder addd= new StringBuilder();
    string[] array;

    private async void btndosyasec_Click(object sender, RoutedEventArgs e)
    {
        FileOpenPicker openPicker = new FileOpenPicker();
        openPicker.ViewMode = PickerViewMode.List;
        openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        openPicker.FileTypeFilter.Add(".pdf");

        StorageFile file = await openPicker.PickSingleFileAsync();



        if (file != null)
        {

            PdfReader reader = new PdfReader((await file.OpenReadAsync()).AsStream());

            for (int page = 1; page <= reader.NumberOfPages; page++)
            {

                addd.Append(PdfTextExtractor.GetTextFromPage(reader, page));
                string tmp= PdfTextExtractor.GetTextFromPage(reader, page);

                array[page] = tmp.ToString();

                reader.Close();
            }
        }
    }

【问题讨论】:

  • 那么发布的代码有什么问题?
  • 您认为 PDF 中有行的假设可能是错误的。请阅读openhealthnews.com/articles/2014/… 以了解内容如何存储在 PDF 中。
  • 我建议从 Adob​​e 网站获取 Acrobat SDK,并仔细查看文档,特别是 Portable Document Format Reference(我认为它是这样命名的)。这让您了解 PDF 的结构,然后您可以重新考虑要完成的工作。 (一个简单的提示:PDF 不是文本格式!)。如果您出于某种原因想避开 Adob​​e 网站,您还可以获得 ISO 32000 的副本。

标签: c# file pdf itextsharp


【解决方案1】:

以下代码适用于 iText7

using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;


public void ExtractTextFromPDF(string filePath)
{
    PdfReader pdfReader = new PdfReader(filePath);
    PdfDocument pdfDoc = new PdfDocument(pdfReader);

    for (int page = 1; page <= pdfDoc.GetNumberOfPages(); page++)
    {
        ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
        string pageContent = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(page), strategy);

        Console.WriteLine("pageContent : " + pageContent);
    }
    pdfDoc.Close();
    pdfReader.Close();
}

【讨论】:

    【解决方案2】:

    您好,我也遇到了这个问题,我使用了这个代码,它成功了。

    您将需要对 iTextSharp 库的引用。

    using iTextSharp.text.pdf;
    using iTextSharp.text.pdf.parser;
    
    PdfReader reader = new PdfReader(@"D:\test pdf\Blood Journal.pdf");
    int intPageNum = reader.NumberOfPages;
    string[] words;
    string line;
    
        for (int i = 1; i <= intPageNum; i++)
        {
            text = PdfTextExtractor.GetTextFromPage(reader, i, new LocationTextExtractionStrategy());
    
            words = text.Split('\n');
            for (int j = 0, len = words.Length; j < len; j++)
            {
                line = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(words[j]));
            }
        }
    

    words 数组包含 pdf 文件的行

    【讨论】:

      【解决方案3】:

      如果您正在寻找从 PDF 中提取基本文本的 无许可证/开源,那么您可以选择同时支持 .Net Framework 的 PdfClown以及 .NET CORE(尽管 Beta 版 w.r.t .NET Standard 2.0)。有关更多信息或示例,请查看

      https://www.nuget.org/packages/PdfClown.NetStandard/0.2.0-beta

      https://sourceforge.net/p/clown/code/HEAD/tree/trunk/dotNET/pdfclown.samples.cli/

      以下示例是 w.r.t .NET CORE。

      public class PdfClownUtil
      {
          private static readonly string fileSrcPath = "MyTestDoc.pdf";
          private readonly StringBuilder stringBuilder_1 = new StringBuilder();
          public string GetPdfTextContent()
          {
              PdfDocuments.Document document = new File(fileSrcPath).Document;
              StringBuilder stringBuilder_2 = new StringBuilder();
      
              TextExtractor extractor = new TextExtractor();
              foreach (Page page in document.Pages)
              {
                  // Approach-1: 
                  Extract(new ContentScanner(page));
      
                  // Approach-2 with additional Options: 
                  IList<ITextString> textStrings = extractor.Extract(page)[TextExtractor.DefaultArea];
                  foreach (ITextString textString in textStrings)
                  {
                      stringBuilder_2.Append(textString.Text);
                  }
                  stringBuilder_2.AppendLine();
              }
              var content = stringBuilder_2.ToString();
              return content;
          }
      
          // Approach-1: 
          private void Extract(ContentScanner level)
          {
              if (level == null)
              {
                  return;
              }                
      
              while (level.MoveNext())
              {
                  ContentObject content = level.Current;
                  if (content is ShowText)
                  {
                      Font font = level.State.Font;
                      // Extract the current text chunk, decoding it!
                      this.stringBuilder_1.Append(font.Decode(((ShowText)content).Text));
                  }
                  else if (content is Text || content is ContainerObject)
                  {
                      // Scan the inner level!
                      Extract(level.ChildLevel);
                  }
              }
          }
      }
      

      【讨论】:

      • 虽然 PDF Clown 最初确实是一个有趣的 PDF 库,但它必须被视为孤立和废弃; 0.2.0 版本已于 2015 年 7 月发布,我们仍在等待。
      • 这是 LGPL 粗俗
      猜你喜欢
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2010-12-24
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多