【问题标题】:PDF text search and split libraryPDF文本搜索和拆分库
【发布时间】:2010-04-21 07:23:53
【问题描述】:

我正在寻找一个服务器端 PDF 库(或命令行工具),它可以:

  • 将多页 PDF 文件拆分为单独的 PDF 文件,基于
  • PDF 文件内容的搜索结果

例子:

  • 搜索“页面???”文本中的模式并将大 PDF 拆分为 001.pdf, 002,pdf, ... ???.pdf

服务器程序将扫描 PDF,查找搜索模式,保存与模式匹配的页面,并将文件保存在磁盘中。

与 PHP / Ruby 集成会很好。命令行工具也是可以接受的。它将是一个服务器端(linux 或 win32)批处理工具。不支持 GUI/登录。 i18n 支持会很好,但不是必需的。谢谢~

【问题讨论】:

    标签: search pdf


    【解决方案1】:

    我的公司Atalasoft 刚刚发布了一些在.NET 上运行的PDF 操作工具。有一个文本提取类可用于查找文本并确定如何拆分文档,还有一个非常高级的文档类,使拆分变得微不足道。假设您有一个指向源 PDF 的 Stream 和一个描述每个拆分的起始页的有序列表,那么生成拆分文件的代码如下所示:

    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;
    }
    

    其中StartPageEndPage包含了描述一个页面范围,那么代码就更简单了:

    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++;
        }
    }
    

    【讨论】:

      【解决方案2】:

      PDFBox 是一个 Java 库,但它也有一些命令行工具:

      http://pdfbox.apache.org/

      PDFBox 可以提取文本并重新构建/拆分 PDFS

      【讨论】:

        【解决方案3】:
        【解决方案4】:

        您可以使用pdfsam 将文件拆分为页面,然后使用pdftotext(来自foolabs.com)将其转换为文本并使用ruby(或grep)查找字符串。然后你就有了页面范围,并且可以返回之前生成的页面。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-14
          • 2011-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-21
          • 1970-01-01
          相关资源
          最近更新 更多