Извлечение диаграммы из файла PDF

Вопрос или проблема

У меня есть программа, которая ранее использовала ChatGPT для сканирования документов и уведомления, когда на странице содержалась схема, такая как таблица или график. Поскольку ChatGPT больше не принимает изображения через API, я использовал веб-сайт ChatGPT для ручной обработки этих страниц, что занимает много времени.

Я хочу повторно автоматизировать этот процесс. К сожалению, службы оптического распознавания символов (OCR), которые я пробовал, такие как Azure OCR, Amazon Rekognition и Google Cloud Vision OCR, не обладают теми же возможностями.

Я пробовал использовать следующий код для этого:

using System;
using System.Collections.Generic;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;

namespace PdfImageDetectionTest
{
    class Program
    {
        public static List<int> GetPagesWithImages(string pdfPath)
        {
            List<int> pagesWithImages = new List<int>();

            // Загрузить PDF документ
            using (PdfReader pdfReader = new PdfReader(pdfPath))
            using (PdfDocument pdfDocument = new PdfDocument(pdfReader))
            {
                int totalPages = pdfDocument.GetNumberOfPages();

                for (int i = 1; i <= totalPages; i++)
                {
                    // Использовать пользовательский слушатель для обнаружения изображений
                    ImageDetectionListener imageListener = new ImageDetectionListener();
                    PdfCanvasProcessor processor = new PdfCanvasProcessor(imageListener);
                    processor.ProcessPageContent(pdfDocument.GetPage(i));

                    // Если слушатель нашел изображения, добавить номер страницы в список
                    if (imageListener.HasImage())
                    {
                        pagesWithImages.Add(i);
                    }
                }
            }

            return pagesWithImages;
        }

        public static void Main(string[] args)
        {
            // Путь к вашему тестовому PDF файлу
            string pdfPath = "path/to/your/test-file.pdf";

            List<int> pagesWithImages = GetPagesWithImages(pdfPath);

            if (pagesWithImages.Count > 0)
            {
                Console.WriteLine("Страницы с изображениями: " + string.Join(", ", pagesWithImages));
            }
            else
            {
                Console.WriteLine("Нет страниц с изображениями.");
            }

            // Держим окно консоли открытым
            Console.WriteLine("Нажмите любую клавишу для выхода...");
            Console.ReadKey();
        }
    }

    public class ImageDetectionListener : IEventListener
    {
        private bool foundImage = false;

        public void EventOccurred(IEventData data, EventType type)
        {
            if (type == EventType.RENDER_IMAGE)
            {
                foundImage = true; // Изображение найдено!
            }
        }

        public bool HasImage()
        {
            return foundImage;
        }

        public ICollection<EventType> GetSupportedEvents()
        {
            // Слушать только события рендеринга изображений
            return new HashSet<EventType> { EventType.RENDER_IMAGE };
        }
    }
}

Но поскольку весь файл является отсканированным документом, он распознает все страницы как содержащие схемы, а не только те, которые нам нужны. Есть ли более простой способ сделать это или библиотека/пакет, которые на самом деле смогут сделать то, что мы хотим?

Ответ или решение

Автоматизация извлечения диаграмм из PDF файлов

Ваша задача заключается в автоматизации процесса извлечения диаграмм (таких как таблицы или графики) из PDF документов. Поскольку вы столкнулись с ограничениями при использовании OCR-сервисов, таких как Azure OCR, Amazon Rekognition и Google Cloud Vision OCR, необходимо рассмотреть другие подходы для решения этой проблемы.

Проблема

Ваш текущий код на C#, использующий библиотеку iText, генерирует ложные срабатывания, потому что он не способен различать изображение и сканированные страницы документа. Каждый раз, когда страница имеет какой-либо графический элемент, например, текстовый блок или фоновый рисунок, библиотека iText считает это изображением, что приводит к тому, что каждая страница распознаётся, как содержащая диаграмму.

Возможные решения

  1. Анализ контента с использованием поверченных изображений и других элементов: Вместо того чтобы полагаться только на события рисования изображений, можно дополнительно анализировать содержимое страниц PDF на наличие специфических элементов, как векторы, или искать ключевые слова, указывающие на таблицы или графики. В библиотеке iText можно также использовать возможности анализа текста.

  2. Использование специализированных библиотек:

    • Tabula: Это Java-библиотека, предназначенная для извлечения таблиц из PDF. С помощью Tabula можно легко извлечь содержимое таблиц без необходимости ручного анализа.
    • Apache PDFBox: Эта библиотека также предоставляет больше возможностей для анализа содержимого, включая извлечение текста, изображений и возможности работы с аннотациями.
    • Tika: Кроме анализа текстов, Tika может помочь в извлечении метаданных и других данных из PDF, которые могут указать на наличие диаграмм.
  3. Переход к машинному обучению: Решения на основе машинного обучения могут быть более эффективными в анализе содержимого PDF файлов. Вы можете обучить модель, которая будет распознавать, являются ли определённые объекты в документе диаграммами или нет. Использование фреймворков, таких как TensorFlow или PyTorch, может помочь в разработке такой системы.

  4. Использование библиотеки PDF.js: Хотя это больше библиотека для просмотра PDF в вебе, она позволяет извлекать текст и изображения из PDF, что может быть полезно в разработке вашего собственного решения.

Пример альтернативного кода

Если вы хотите продолжить с использованием iText, вот подход, который может помочь минимизировать ложные срабатывания:

using System;
using System.Collections.Generic;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;

namespace PdfImageDetectionTest
{
    class Program
    {
        public static List<int> GetPagesWithDiagrams(string pdfPath)
        {
            List<int> pagesWithDiagrams = new List<int>();

            using (PdfReader pdfReader = new PdfReader(pdfPath))
            using (PdfDocument pdfDocument = new PdfDocument(pdfReader))
            {
                int totalPages = pdfDocument.GetNumberOfPages();

                for (int i = 1; i <= totalPages; i++)
                {
                    // Предположим, что мы ищем текстовые паттерны рядом с изображениями
                    string pageText = PdfTextExtractor.GetTextFromPage(pdfDocument.GetPage(i));
                    if (ContainsDiagramIndicators(pageText)) // Ваша логика для поиска уникальных индикаторов
                    {
                        pagesWithDiagrams.Add(i);
                    }
                }
            }

            return pagesWithDiagrams;
        }

        private static bool ContainsDiagramIndicators(string text)
        {
            // Ваша логика для определения наличия возможности диаграммы
            return text.Contains("Таблица") || text.Contains("График"); // Добавьте свои ключевые слова
        }

        public static void Main(string[] args)
        {
            string pdfPath = "path/to/your/test-file.pdf";
            List<int> pagesWithDiagrams = GetPagesWithDiagrams(pdfPath);

            if (pagesWithDiagrams.Count > 0)
            {
                Console.WriteLine("Страницы с диаграммами: " + string.Join(", ", pagesWithDiagrams));
            }
            else
            {
                Console.WriteLine("Нет страниц с диаграммами.");
            }
            Console.WriteLine("Нажмите любую клавишу для выхода...");
            Console.ReadKey();
        }
    }
}

Заключение

Автоматизация извлечения диаграмм из PDF может быть сложной задачей, особенно при работе со сканированными документами. Оптимизация процесса требует более глубокого понимания содержимого документа и адаптации алгоритмов для более точного выявления диаграмм. Рассмотрите возможность использовать сочетание надстройки обработки текста, анализа контента и специализированных библиотек, чтобы добиться наилучших результатов.

Оцените материал
Добавить комментарий

Капча загружается...