iText C#读取pdf进行正则表达式匹配,只将这些页面提取为新的pdf



我在读取现有的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-代码重写而不是附加页面

通过一些小的调整,我能够得到下面的解决方案来为我的项目工作。

最新更新