【问题标题】:Determine number of pages in a PDF file [closed]确定 PDF 文件中的页数 [关闭]
【发布时间】:2010-09-24 03:10:41
【问题描述】:

我需要使用 C# 代码 (.NET 2.0) 确定指定 PDF 文件中的页数。 PDF 文件将从文件系统中读取,而不是从 URL 中读取。有谁知道如何做到这一点?注意:执行此检查的 PC 上已安装 Adob​​e Acrobat Reader。

【问题讨论】:

    标签: c# pdf .net-2.0


    【解决方案1】:

    您需要用于 C# 的 PDF API。 iTextSharp 是一种可能的 API,尽管可能存在更好的 API。

    iTextSharp 示例

    您必须安装 iTextSharp.dll 作为参考。从 SourceForge.net 下载 iTextsharp 这是一个使用控制台应用程序的完整工作程序。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using iTextSharp.text.pdf;
    using iTextSharp.text.xml;
    namespace GetPages_PDF
    {
      class Program
    {
        static void Main(string[] args)
          {
           // Right side of equation is location of YOUR pdf file
            string ppath = "C:\\aworking\\Hawkins.pdf";
            PdfReader pdfReader = new PdfReader(ppath);
            int numberOfPages = pdfReader.NumberOfPages;
            Console.WriteLine(numberOfPages);
            Console.ReadLine();
          }
       }
    }
    

    【讨论】:

    • 所以你是说“这是我推荐的,但实际上有更好的方法来做到这一点”?
    • 谢谢,Darkdog,在查看了 PDFLib 和 iTextSharp 之后,我最终使用了 iTextSharp: PdfReader pdfReader = new PdfReader(pdfFilePath); int numberOfPages = pdfReader.NumberOfPages;希望这对面临同样问题的人有所帮助。
    • 感谢 MagicAndi 发布代码。很有用
    • @MagicAndi 感谢您发布代码!
    • 现在是 iText7,提取页数的代码是 PdfDocument pdfDoc = new PdfDocument(new PdfReader(fileName)) 然后 pdfDoc.GetNumberOfPages();您可以从 NuGet 包中获取项目。
    【解决方案2】:

    我为此使用了pdflib

        p = new pdflib();
    
        /* Open the input PDF */
        indoc = p.open_pdi_document("myTestFile.pdf", "");
        pageCount = (int) p.pcos_get_number(indoc, "length:pages");
    

    【讨论】:

      【解决方案3】:

      我在使用 CeTe Dynamic PDF 产品方面取得了巨大成功。它们不是免费的,但有据可查。他们为我完成了这项工作。

      http://www.dynamicpdf.com/

      【讨论】:

        【解决方案4】:

        http://www.dotnetspider.com/resources/21866-Count-pages-PDF-file.aspx 找到了一条路 这不需要购买 pdf 库

        【讨论】:

        • Rachael,终于复习了这个问题,并查看了您的链接。谢谢,下次出现这个问题的时候试试! +1
        【解决方案5】:

        这应该可以解决问题:

        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;
            }
        }
        

        来自Rachael's answerthis one

        【讨论】:

        • Barrett,感谢您提供示例代码。 +1
        • 我认为这不会总是给出正确的计数。它也不适用于加密的 PDF。
        • @TimB 我保存了一个加密的 PDF 并且可以使用它。
        • 效果很好,但比 iTextSharp 解决方案慢。
        • PDF 使用版本化对象,如果 PDF 尚未清理,还可以包含已删除的对象,因此可能有实际未链接到 PDF 或已被替换为较新的版本。这就是为什么使用维护的 PDF 库比自己做更好的主意。
        【解决方案6】:

        我使用了上面的代码,它使用正则表达式解决了这个问题,它可以工作,但是速度很慢。它读取整个文件以确定页数。

        我在一个网络应用程序中使用它,页面有时会一次列出 20 或 30 个 PDF,在这种情况下,由于页面计数方法,页面的加载时间从几秒钟变为近一分钟。

        我不知道 3rd 方库是否更好,我希望他们是,并且我在其他场景中成功使用了 pdflib。

        【讨论】:

        • Ryan,我使用 iTextSharp 库解决了这个问题,发现它提供了不错的性能。您还可以查看 PDFSharp。至于正则表达式解决方案的问题,这是正则表达式导致的问题多于解决的问题的另一个例子 - codinghorror.com/blog/archives/001016.html
        • 同意。直到之后我才看到您的注释,但是我按照您的建议将 RegEx 函数替换为使用 iTextSharp 的函数,并且性能有了很大的提高。根据我的测试,iTextSharp 方法至少比 RegEx 方法快 5 倍,并且通常比这快很多,至少在我同时计算多个 PDF 文件时(即加载列出多个 PDF 的页面) )。
        • 如果性能有问题,您可能想尝试使用 PDFLeo (rockpdf.com) 等命令行实用程序。像“pdfleo -i myfile.pdf | grep "Number of Pages" 这样的命令在 300 页文件上花费的时间不到 1 秒。
        【解决方案7】:

        Docotic.Pdf library 可用于完成任务。

        这里是示例代码:

        PdfDocument document = new PdfDocument();
        document.Open("file.pdf");
        int pageCount = document.PageCount;
        

        该库将尽可能少地解析,因此性能应该没问题。

        免责声明:我为 Bit Miracle 工作。

        【讨论】:

        • 我不想讽刺,但您应该检查您的绩效声明。我尝试了一个 250 页的 PDF,216Mo,它比 PDF-Sharp 慢了近 20 倍,只是为了获得页数,使用你的例子
        【解决方案8】:

        一行:

        int pdfPageCount = System.IO.File.ReadAllText("example.pdf").Split(new string[] { "/Type /Page" }, StringSplitOptions.None).Count()-2;
        

        推荐: ITEXTSHARP

        【讨论】:

        • 适用于我的文件。它足够快满足我的需要,但我想知道与@Barrett 发布的正则表达式解决方案相比性能如何
        猜你喜欢
        • 2011-05-07
        • 1970-01-01
        • 2011-03-07
        • 2021-10-02
        • 1970-01-01
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        • 2017-10-20
        相关资源
        最近更新 更多