代码之家  ›  专栏  ›  技术社区  ›  ohho

PDF文本搜索和拆分库

  •  3
  • ohho  · 技术社区  · 15 年前

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

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

    示例:

    • 搜索“页面???”在文本中填充图案,并将大PDF拆分为001.pdf、002、pdf…。????pdf

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

    与php/ruby集成会很好。命令行工具也是可以接受的。它将是一个服务器端(Linux或Win32)批处理工具。不支持GUI/登录。I18N支持很好,但不需要。谢谢~

    4 回复  |  直到 11 年前
        1
  •  4
  •   SliverNinja - MSFT    11 年前

    我的公司, Atalasoft ,刚刚发布了一些在.NET上运行的PDF操作工具。有一个文本提取类,您可以使用它来查找文本并确定如何拆分文档,还有一个非常高级的文档类,它使拆分变得非常简单。假设您有一个到源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++;
        }
    }
    
        2
  •  2
  •   Steve Claridge    15 年前

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

    http://pdfbox.apache.org/

    pdfbox可以提取文本,也可以重建/拆分pdf

        4
  •  1
  •   topskip    15 年前

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