Определить количество страниц в PDF-файле

Мне нужно определить количество страниц в указанном PDF-файле с помощью кода C# (.NET 2.0). Файл PDF будет считываться из файловой системы, а не из URL-адреса. Кто-нибудь знает, как это можно сделать? Примечание. Adobe Acrobat Reader установлен на ПК, на котором будет выполняться эта проверка.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
57
0
108 150
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

Вам понадобится PDF API для C#. iTextSharp - один из возможных API, хотя могут существовать и лучшие.

Пример iTextSharp

Вы должны установить iTextSharp.dll как ссылку. Загрузите iTextsharp с SourceForge.net. Это полноценная рабочая программа, использующая консольное приложение.

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

Так вы говорите: «Вот что я рекомендую, но на самом деле есть способы сделать это лучше»?

Mitch Wheat 26.11.2008 14:09

Спасибо, Darkdog, после просмотра PDFLib и iTextSharp я в итоге использовал iTextSharp: PdfReader pdfReader = new PdfReader (pdfFilePath); int numberOfPages = pdfReader.NumberOfPages; Надеюсь, это поможет кому-то столкнуться с той же проблемой.

MagicAndi 17.03.2009 17:03

Спасибо MagicAndi за размещение кода. Очень полезный

lidermin 24.07.2010 01:54

@MagicAndi Спасибо, что разместили код!

Dragos Durlut 06.02.2012 16:34

@liang это одноразовая. Нет нулевой страницы.

Dave 05.10.2015 23:52

Теперь это iText7, а код для извлечения количества страниц - PdfDocument pdfDoc = new PdfDocument (new PdfReader (fileName)), а затем pdfDoc.GetNumberOfPages (); Вы можете получить проект из пакетов NuGet.

Samuel 24.01.2020 22:49

Не забудьте выбросить PdfReader: using(var pdfReader = new PdfReader(ppath)) { ... }.

Bohdan 07.08.2020 12:45

Я использовал для этого pdflib.

    p = new pdflib();

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

У меня хорошие успехи в использовании продуктов CeTe Dynamic PDF. Они не бесплатны, но хорошо задокументированы. Они сделали всю работу за меня.

http://www.dynamicpdf.com/

нашел способ в http://www.dotnetspider.com/resources/21866-Count-pages-PDF-file.aspx это не требует покупки библиотеки pdf

Рэйчел, наконец, рассмотрела этот вопрос и проверила вашу ссылку. Спасибо, один, чтобы попробовать в следующий раз, когда возникнет эта проблема! +1

MagicAndi 20.11.2009 03:34

Это должно помочь:

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

От Ответ Рэйчел и Вот этот тоже.

Барретт, спасибо за пример кода. +1

MagicAndi 20.11.2009 03:35

Я не думаю, что это всегда дает правильный результат. Он также не будет работать с зашифрованными PDF-файлами.

Tim B 25.09.2012 22:13

@TimB Я сохранил зашифрованный PDF-файл, и он работает с ним.

Cristian Lupascu 21.01.2013 12:38

@ w0lf Похоже, вы правы. Объекты страницы - одна из немногих вещей в зашифрованном PDF-файле, которую можно прочитать без пароля.

Tim B 21.01.2013 18:17

У меня не получилось - скопировал и вставил именно так, как показано. Он вернул значение 216, в то время как PDF-файл действительно состоял из 111 страниц.

Paul 11.04.2014 00:30

Отлично работает, но медленнее, чем решение iTextSharp.

aloisdg 13.04.2015 12:09

PDF использует версионные объекты, а также может включать удаленные объекты, если PDF не был очищен, поэтому могут быть объекты Page, которые фактически не связаны с PDF или которые были заменены более новой версией. Вот почему лучше использовать поддерживаемую библиотеку PDF, чем делать это самостоятельно.

Thomas S. Trias 14.04.2016 00:37

Я знаю, что это старый вопрос, но я искал способ получить общее количество страниц, но заметил, что должен прочитать весь документ. У меня действительно большие файлы, и я хотел бы получить количество страниц, не читая весь PDF-файл. Можно ли это сделать без внешних зависимостей?

Misiu 02.08.2016 14:15

Я знаю, что это очень старый вопрос и ответ, но я нашел этот ответ в Google некоторое время назад и просто вернулся к нему. Этот ответ работает, но вызовет исключение OutOfMemoryException в больших PDF-файлах (т.е. PDF-файлах со 150 изображениями с разрешением 300dpi). Ответ iTextSharp, предоставленный darkdog, отлично работает

Ieuan 27.10.2016 13:12

Поддерживает ли это файлы tif?

goofyui 04.03.2018 05:52

Я использовал приведенный выше код, который решает проблему с помощью регулярного выражения, и он работает, но довольно медленно. Он читает весь файл, чтобы определить количество страниц.

Я использовал его в веб-приложении, и страницы иногда отображали 20 или 30 PDF-файлов за раз, и в этом случае время загрузки страницы увеличилось с пары секунд до почти минуты из-за метода подсчета страниц.

Я не знаю, намного ли лучше сторонние библиотеки, я надеюсь, что они есть, и я успешно использовал pdflib в других сценариях.

Райан, я использовал библиотеку iTextSharp для решения этой проблемы и обнаружил, что она дает приличную производительность. Вы также можете посмотреть PDFSharp. Что касается проблем с решением регулярных выражений, это еще один пример того, что регулярные выражения вызывают больше проблем, чем решают - codinghorror.com/blog/archives/001016.html

MagicAndi 03.02.2010 13:23

Согласовано. Я видел вашу заметку только после этого, но я заменил функцию RegEx на функцию, использующую iTextSharp, как вы рекомендуете, и производительность значительно улучшилась. Основываясь на моих тестах, метод iTextSharp как минимум в 5 раз быстрее, чем метод RegEx, и обычно намного больше, по крайней мере, когда я рассчитываю для нескольких файлов PDF одновременно (т.е. загружаю страницу с несколькими перечисленными PDF-файлами. ).

user264631 16.02.2010 07:39

Если производительность является проблемой, вы можете попробовать утилиту командной строки, такую ​​как PDFLeo (rockpdf.com). Команда типа "pdfleo -i myfile.pdf | grep" Number of Pages "занимает менее 1 секунды на 300-страничном файле.

cuteCAT 30.10.2012 20:48

Библиотека Docotic.Pdf может использоваться для выполнения задачи.

Вот пример кода:

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

Библиотека будет анализировать как можно меньше, поэтому производительность должна быть в порядке.

Отказ от ответственности: я работаю в Bit Miracle.

Я не хочу быть саркастичным, но вы должны проверить свое заявление о производительности. Я попробовал 250 страниц PDF, 216Mo, и он был почти в 20 раз медленнее, чем PDF-Sharp, просто чтобы получить количество страниц, используя ваш пример

Guillaume 01.06.2013 16:49

Одна линия:

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

Рекомендуемые: ITEXTSHARP

Хорошо работает с моими файлами. Это достаточно быстро для моих нужд, но мне интересно, какова производительность по сравнению с решением с регулярными выражениями, опубликованным @Barrett

Maxter 09.05.2019 18:01

Другие вопросы по теме