簡體   English   中英

iText C#閱讀pdf進行正則表達式匹配,僅將這些頁面提取到新的pdf

[英]iText C# Read pdf for regular expression match, extract only those pages to new pdf

我正在閱讀現有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 - 代碼覆蓋而不是附加頁面

正如@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,文檔級文件附件等。無論您是否需要,都取決於您的用例。

感謝您的回復mkl。 我回答了我的其他帖子,但忘了這個。 我能夠在我的其他(類似)帖子中使用Chris提供的測試用例。

C#iTextSharp - 代碼覆蓋而不是附加頁面

通過一些小的調整,我能夠得到下面的解決方案,為我的項目工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM