2010-04-21 65 views
3

我尋找一個服務器端的PDF庫(或命令行工具),它可以:PDF文本搜索和分庫

  • 分割多頁的PDF文件轉換成單獨的PDF文件,基於
  • PDF文件內容的搜索結果

例子:

  • 搜索 「頁面???」模式在文本和拆分大的PDF到001.pdf,002,pdf,... ???。pdf

服務器程序將掃描PDF,尋找搜索模式,保存頁面)匹配模式,並將文件保存在磁盤中。

與PHP/Ruby集成將會很好。命令行工具也是可以接受的。它將成爲服務器端(linux或win32)批處理工具。不支持GUI /登錄。 i18n支持將會很好,但不是必需的。謝謝〜

回答

1

你可以使用pdfsam在頁面中分割你的文件,然後使用pdftotext(從foolabs.com)將它變成文本並使用ruby(或grep)來查找字符串。然後你有頁面範圍,並可以返回以前生成的頁面。

4

我的公司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; 
} 

其中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