PDF_экстракция структурированных данных без OCR - PullRequest
1 голос
/ 13 февраля 2020

Я пытался извлечь данные, в том числе таблицы в файлах pdf, используя C#. Моя цель - извлечь эти данные без какой-либо сторонней библиотеки или OCR одновременно извлекать данные без потери их структуры. это нужно для создания DLL для автоматизации PDF.

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Полагаю, лучший способ добиться этого - использовать библиотеку iTextSharp. Он легко доступен в виде пакета Nuget.

Ниже приведен пример:

using System;
using System.IO;
using System.Linq;
using System.Text;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;

namespace Pdf2Text
{
    class Program
    {
        static void Main(string[] args)
        {
            if (!args.Any()) return;

            var file = args[0];
            var output = Path.ChangeExtension(file, ".txt");
            if (!File.Exists(file)) return;

            var bytes = File.ReadAllBytes(file);
            File.WriteAllText(output, ConvertToText(bytes), Encoding.UTF8);
        }

        private static string ConvertToText(byte[] bytes)
        {
            var sb = new StringBuilder();

            try
            {
                var reader = new PdfReader(bytes);
                var numberOfPages = reader.NumberOfPages;

                for (var currentPageIndex = 1; currentPageIndex <= numberOfPages; currentPageIndex++)
                {
                    sb.Append(PdfTextExtractor.GetTextFromPage(reader, currentPageIndex));
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
            }

            return sb.ToString();
        }
    }
}

PS - поскольку вам не нужно решение для оптического распознавания текста, этот способ будет работать. Но это не будет работать, если PDF содержит данные в изображениях. Для этого только OCR будет решением.

Попробуйте и дайте мне знать ваши комментарии.

1 голос
/ 13 февраля 2020
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Word = Microsoft.Office.Interop.Word;
using System.IO;

namespace PDF_EXTRACT
{

    public class pdfTohtm
    {

        public static string ConvertPdf(string path, string outpath)
        {
            Word.Application app = new Word.Application(); ;
            Word.Document doc1;
            try
            {

                doc1 = app.Documents.Open(path, false, ReadOnly: false);
                app.DisplayAlerts = Word.WdAlertLevel.wdAlertsAll;
                app.FileValidation = Microsoft.Office.Core.MsoFileValidationMode.msoFileValidationSkip;
                app.Visible = false;
                app.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable;
                doc1.SaveAs2(outpath, Word.WdSaveFormat.wdFormatFilteredHTML, ReadOnlyRecommended: false);
                doc1.Close();
                string result = File.ReadAllText(outpath + ".htm", Encoding.UTF7);
                return "success:" + result;
            }
            catch (Exception e)
            {


                return "failed::::" + e;


            }
            finally
            {
                app.Quit();
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app);
            }

        }
    }



}

Объяснение: Это решение работает, открывая PDF как редактируемый текстовый документ, затем файл сохраняется как
.htm файл. Теперь файл .htm открывается и читается как текстовый файл, поэтому вывод этого кода представляет собой набор html кодов, которые вы можете вставить в свой Excel, чтобы конвертировать в pdf в Excel, не теряя структуру данных.

КЛЮЧЕВЫЕ ЗАМЕЧАНИЯ:

  1. Это решение не работает, если pdf является отсканированной копией, для таких
    pdfs OCR, кажется, единственный вариант, согласно моим небольшим знаниям о
    предмет.

2.Для аргумента «путь» необходимо передать полный путь к файлу, а для аргумента «путь» передать путь без расширения, например: C: \ Users \ username \ folder \ filename (расширение файла, т.е. ".htm" не требуется).

...