使用 iTextSharp 7 在 PDF 中搜索关键字

Searching for a keyword in PDF using iTextSharp 7

我正在尝试使用 C# 和 iTextSharp 在 PDF 文件中搜索关键字。

所以我遇到了这段代码:

public List<int> ReadPdfFile(string fileName, String searthText)
        {
            List<int> pages = new List<int>();
            if (File.Exists(fileName))
            { 
                PdfReader pdfReader = new PdfReader(fileName);
                for (int page = 1; page <= pdfReader.NumberOfPages; page++)
                {
                    ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();

                    string currentPageText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
                    if (currentPageText.Contains(searthText))
                    {
                        pages.Add(page);
                    }
                }
                pdfReader.Close();
            }
            return pages;
        }

但是它说 PdfReader 不包含 NumberOfPages 的定义。有没有其他方法可以获取 PDF 文件的页数?

你可以改变这个

pdfReader.NumberOfPages

来自

getNumberOfPdfPages(fileName)

和方法(reference):

public int getNumberOfPdfPages(string fileName)
{
    using (StreamReader sr = new StreamReader(File.OpenRead(fileName)))
    {
        Regex regex = new Regex(@"/Type\s*/Page[^s]");
        MatchCollection matches = regex.Matches(sr.ReadToEnd());

        return matches.Count;
    }
}

但是无法识别 NumberOfPages 似乎很奇怪...您确定 using 吗?

您找到的这段代码适用于 iText 5。5.x。 iText 7 从根本上改变了 API,因此您的 NumberOfPages 问题并不是您必须处理的唯一问题。

尽管如此:要获取 iText 7 中的页数,您现在使用 PdfDocument 方法 GetNumberOfPages 而不是以前的 PdfReader 属性 NumberOfPages.

更一般地说,将您的方法移植到 iText 7 可能如下所示:

public List<int> ReadPdfFile(string fileName, String searthText)
{
    List<int> pages = new List<int>();
    if (File.Exists(fileName))
    {
        using (PdfReader pdfReader = new PdfReader(fileName))
        using (PdfDocument pdfDocument = new PdfDocument(pdfReader))
        {
            for (int page = 1; page <= pdfDocument.GetNumberOfPages(); page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();

                string currentPageText = PdfTextExtractor.GetTextFromPage(pdfDocument.GetPage(page), strategy);
                if (currentPageText.Contains(searthText))
                {
                    pages.Add(page);
                }
            }
        }
    }
    return pages;
}