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

时间:2015-02-22 03:59:26

标签: c# pdf itextsharp

我正在阅读现有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

2 个答案:

答案 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

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