我正在阅读现有pdf中的正则表达式匹配问题,然后将这些页面提取到新的pdf。我整体上遇到了一些问题。
我决定清醒过头,从头开始。我可以使用以下代码获取3页pdf并将页面分别提取到一个新文件中:
static void Main(string[] args)
{
string srcFile = @"C:\Users\steve\Desktop\original.pdf";
string dstFile = @"C:\Users\steve\Desktop\result.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循环中是OUTSIDE。我遇到的问题是,我似乎能够获得代码(转换为文本和查找正则表达式匹配)的唯一方法是将该功能(包括PdfCopy实例)放在for循环中。
以下是我最初提问的代码:C# iTextSharp - Code overwriting instead of appending pages
答案 0 :(得分:0)
@Paulo已在评论中提出:
在进入循环之前,您必须使用正则表达式或其他任何方式选择页面。在循环内部,只会添加这些页面。
在代码中,这可能如下所示:
string srcFile = @"C:\Users\steve\Desktop\original.pdf";
string dstFile = @"C:\Users\steve\Desktop\result.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,文档级文件附件等。无论您是否需要,都取决于您的使用案例。
答案 1 :(得分:0)
感谢您的回复mkl。我回答了我的其他帖子,但忘了这个。我能够在我的其他(类似)帖子中使用Chris提供的测试用例。
C# iTextSharp - Code overwriting instead of appending pages
通过一些小的调整,我能够得到下面的解决方案,为我的项目工作。