我正在寻找服务器端PDF库(或命令行工具),它可以:
示例:
服务器程序将扫描PDF,查找搜索模式,保存与模式匹配的页面,并将文件保存在磁盘中。
与PHP / Ruby集成会很好。命令行工具也是可以接受的。它将是服务器端(linux或win32)批处理工具。不支持GUI /登录。 i18n支持会很好但不需要。感谢〜
答案 0 :(得分: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);
}
如果将其概括为页面范围struct:
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++;
}
}
答案 1 :(得分:3)
答案 2 :(得分:2)
答案 3 :(得分:1)
您可以使用pdfsam在页面中拆分文件,然后使用pdftotext(来自foolabs.com)将其转换为文本并使用ruby(或grep)查找字符串。然后你有页面范围,可以返回以前生成的页面。