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