[英]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提供的測試用例。
通過一些小的調整,我能夠得到下面的解決方案,為我的項目工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.