我在读取现有的pdf以匹配正则表达式时遇到问题,然后将这些页面提取为新的pdf。作为一个整体,我遇到了一些问题。
我决定洗心革面,从头开始。我可以使用以下代码将3页的pdf文件单独提取到一个新文件中:
static void Main(string[] args)
{
string srcFile = @"C:UserssteveDesktoporiginal.pdf";
string dstFile = @"C:UserssteveDesktopresult.pdf";
PdfReader reader = new PdfReader(srcFile);
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileStream(dstFile, FileMode.Create));
document.Open();
for (int page = 1; page <= reader.NumberOfPages; page++)
{
PdfImportedPage importedPage = copy.GetImportedPage(reader, page);
copy.AddPage(importedPage);
}
document.Close();
}
此代码之所以有效,是因为PdfCopy实例在for循环之外。我遇到的问题是,获得代码(用于转换为文本并查找正则表达式匹配项)的唯一方法似乎是将该功能(包括PdfCopy实例)放置在for循环中。
这是我最初的问题中的代码:C#iTextSharp-代码覆盖而不是附加页面
正如@Paulo在评论中提出的那样:
在进入循环之前,您必须使用regex或任何其他方式选择页面。在循环中,只会添加那些页面。
在代码中,这可能看起来像这样:
string srcFile = @"C:UserssteveDesktoporiginal.pdf";
string dstFile = @"C:UserssteveDesktopresult.pdf";
PdfReader reader = new PdfReader(srcFile);
ICollection<int> pagesToKeep = new List<int>();
for (int page = 1; page <= reader.NumberOfPages; page++)
{
// Use the text extraction strategy of your choice here...
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentText = PdfTextExtractor.GetTextFromPage(reader, page, strategy);
// Use the content text test of your choice here...
if (currentText.IndexOf("special") > 0)
{
pagesToKeep.Add(page);
}
}
// Copy selected pages using PdfCopy
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileStream(dstFile, FileMode.Create));
document.Open();
foreach (int page in pagesToKeep)
{
PdfImportedPage importedPage = copy.GetImportedPage(reader, page);
copy.AddPage(importedPage);
}
document.Close();
reader.Close();
可以通过使用PdfStamper
而不是PdfCopy
来进一步精简代码。只需将// Copy selected pages using PdfCopy
以后的线路更换为
// Copy selected pages using PdfStamper
reader.SelectPages(pagesToKeep);
PdfStamper stamper = new PdfStamper(reader, new FileStream(dstFile, FileMode.Create, FileAccess.Write));
stamper.Close();
后一种变体不仅保留了有问题的页面,还保留了文档级别的材料,例如全局JavaScript、文档级别的文件附件等。您是否希望这样做,取决于您的用例。
感谢您的回复mkl。我接了另一个帖子,但忘了这一个。我能够在我的另一篇(类似的)帖子中使用Chris提供的测试用例。
C#iTextSharp-代码重写而不是附加页面
通过一些小的调整,我能够得到下面的解决方案来为我的项目工作。