PDF текстовый поиск и разделить библиотеку - PullRequest
3 голосов
/ 21 апреля 2010

Я ищу библиотеку PDF на стороне сервера (или инструмент командной строки), которая может:

  • разбить многостраничный PDF-файл на отдельные PDF-файлы на основе
  • результат поиска содержимого файла PDF

Примеры:

  • Поиск "Страница ???" шаблон в тексте и разбить большой PDF на 001.pdf, 002, pdf, ... ???. pdf

Серверная программа будет сканировать PDF, искать шаблон поиска, сохранять страницы, которые соответствуют шаблону, и сохранять файл на диске.

Будет хорошо с интеграцией с PHP / Ruby. Инструмент командной строки также приемлем. Это будет инструмент пакетной обработки на стороне сервера (linux или win32). GUI / логин не поддерживается. Поддержка i18n будет хорошей, но не обязательной. Благодаря ~

Ответы [ 4 ]

4 голосов
/ 23 апреля 2010

Моя компания, Atalasoft , только что выпустила некоторые инструменты для работы с PDF, которые работают в .NET. Существует класс извлечения текста, который вы можете использовать для поиска текста и определения способа разделения документа, и класс документов очень высокого уровня, который делает разбиение тривиальным. Предположим, у вас есть поток в ваш исходный PDF и все более упорядоченный список, который описывает начальную страницу каждого разбиения, а затем код для создания ваших разделенных файлов выглядит так:

public void SplitPdf(Stream stm, List<int> pageStarts, string outputDirectory)
{
    PdfDocument mainDoc = new PdfDocument(stm);
    int lastPage = mainDoc.Pages.Count - 1;

    for (int i=0; i < pageStarts.Count; i++) {
        int startPage = pageStarts[i];
        int endPage= (i < pageStarts.Count - 1) ?
            pageStarts[i + 1] - 1 :
            lastPage;
        if (startPage > endPage) throw new ArgumentException("list is not ordered properly", "pageStarts");
        PdfDocument splitDoc = new PdfDocument();
        for (j = startPage; j <= endPage; j++)
            splitDoc.Pages.Add(mainDoc.Pages[j];

        string outputPath = Path.Combine(outputDirectory, 
                                         string.Format("{0:D3}.pdf", i + 1));
        splitDoc.Save(outputPath);
    }

если вы обобщите это в структуру диапазона страниц:

public struct PageRange {
    public int StartPage;
    public int EndPage;
}

, где StartPage и EndPage включительно описывают диапазон страниц, тогда код проще:

public void SplitPdf(Stream stm, List<PageRange> ranges, string outputDirectory)
{
    PdfDocument mainDoc = new PdfDocument(stm);

    int outputDocCount = 1;
    foreach (PageRange range in ranges) {
        int startPage = Math.Min(range.StartPage, range.EndPage); // assume not in order
        int endPage = Math.Max(range.StartPage, range.EndPage);
        PdfDocument splitDoc = new PdfDocument();
        for (int i=startPage; i <= endPage; i++)
            splitDoc.Pages.Add(mainDoc.Pages[i]);
        string outputPath = Path.Combine(outputDirectory, 
                                         string.Format("{0:D3}.pdf", outputDocCount));
        splitDoc.Save(outputPath);
        outputDocCount++;
    }
}
3 голосов
/ 23 апреля 2010

PDFBox - это библиотека Java, но в ней также есть некоторые инструменты командной строки:

http://pdfbox.apache.org/

PDFBox может извлекать текст, а также восстанавливать / разбивать PDFS

2 голосов
/ 28 апреля 2010
1 голос
/ 21 апреля 2010

Вы можете использовать pdfsam , чтобы разбить ваш файл на страницы, затем использовать pdftotext (из foolabs.com ), чтобы превратить это в текст, и использовать ruby ​​(или grep), чтобы найтистроки.Тогда у вас есть диапазоны страниц и вы можете вернуть предыдущие сгенерированные страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...