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





Вам понадобится 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();
}
}
}
Спасибо, Darkdog, после просмотра PDFLib и iTextSharp я в итоге использовал iTextSharp: PdfReader pdfReader = new PdfReader (pdfFilePath); int numberOfPages = pdfReader.NumberOfPages; Надеюсь, это поможет кому-то столкнуться с той же проблемой.
Спасибо MagicAndi за размещение кода. Очень полезный
@MagicAndi Спасибо, что разместили код!
@liang это одноразовая. Нет нулевой страницы.
Теперь это iText7, а код для извлечения количества страниц - PdfDocument pdfDoc = new PdfDocument (new PdfReader (fileName)), а затем pdfDoc.GetNumberOfPages (); Вы можете получить проект из пакетов NuGet.
Не забудьте выбросить PdfReader: using(var pdfReader = new PdfReader(ppath)) { ... }.
Я использовал для этого 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.dotnetspider.com/resources/21866-Count-pages-PDF-file.aspx это не требует покупки библиотеки pdf
Рэйчел, наконец, рассмотрела этот вопрос и проверила вашу ссылку. Спасибо, один, чтобы попробовать в следующий раз, когда возникнет эта проблема! +1
Это должно помочь:
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
Я не думаю, что это всегда дает правильный результат. Он также не будет работать с зашифрованными PDF-файлами.
@TimB Я сохранил зашифрованный PDF-файл, и он работает с ним.
@ w0lf Похоже, вы правы. Объекты страницы - одна из немногих вещей в зашифрованном PDF-файле, которую можно прочитать без пароля.
У меня не получилось - скопировал и вставил именно так, как показано. Он вернул значение 216, в то время как PDF-файл действительно состоял из 111 страниц.
Отлично работает, но медленнее, чем решение iTextSharp.
PDF использует версионные объекты, а также может включать удаленные объекты, если PDF не был очищен, поэтому могут быть объекты Page, которые фактически не связаны с PDF или которые были заменены более новой версией. Вот почему лучше использовать поддерживаемую библиотеку PDF, чем делать это самостоятельно.
Я знаю, что это старый вопрос, но я искал способ получить общее количество страниц, но заметил, что должен прочитать весь документ. У меня действительно большие файлы, и я хотел бы получить количество страниц, не читая весь PDF-файл. Можно ли это сделать без внешних зависимостей?
Я знаю, что это очень старый вопрос и ответ, но я нашел этот ответ в Google некоторое время назад и просто вернулся к нему. Этот ответ работает, но вызовет исключение OutOfMemoryException в больших PDF-файлах (т.е. PDF-файлах со 150 изображениями с разрешением 300dpi). Ответ iTextSharp, предоставленный darkdog, отлично работает
Поддерживает ли это файлы tif?
Я использовал приведенный выше код, который решает проблему с помощью регулярного выражения, и он работает, но довольно медленно. Он читает весь файл, чтобы определить количество страниц.
Я использовал его в веб-приложении, и страницы иногда отображали 20 или 30 PDF-файлов за раз, и в этом случае время загрузки страницы увеличилось с пары секунд до почти минуты из-за метода подсчета страниц.
Я не знаю, намного ли лучше сторонние библиотеки, я надеюсь, что они есть, и я успешно использовал pdflib в других сценариях.
Райан, я использовал библиотеку iTextSharp для решения этой проблемы и обнаружил, что она дает приличную производительность. Вы также можете посмотреть PDFSharp. Что касается проблем с решением регулярных выражений, это еще один пример того, что регулярные выражения вызывают больше проблем, чем решают - codinghorror.com/blog/archives/001016.html
Согласовано. Я видел вашу заметку только после этого, но я заменил функцию RegEx на функцию, использующую iTextSharp, как вы рекомендуете, и производительность значительно улучшилась. Основываясь на моих тестах, метод iTextSharp как минимум в 5 раз быстрее, чем метод RegEx, и обычно намного больше, по крайней мере, когда я рассчитываю для нескольких файлов PDF одновременно (т.е. загружаю страницу с несколькими перечисленными PDF-файлами. ).
Если производительность является проблемой, вы можете попробовать утилиту командной строки, такую как PDFLeo (rockpdf.com). Команда типа "pdfleo -i myfile.pdf | grep" Number of Pages "занимает менее 1 секунды на 300-страничном файле.
Библиотека Docotic.Pdf может использоваться для выполнения задачи.
Вот пример кода:
PdfDocument document = new PdfDocument();
document.Open("file.pdf");
int pageCount = document.PageCount;
Библиотека будет анализировать как можно меньше, поэтому производительность должна быть в порядке.
Отказ от ответственности: я работаю в Bit Miracle.
Я не хочу быть саркастичным, но вы должны проверить свое заявление о производительности. Я попробовал 250 страниц PDF, 216Mo, и он был почти в 20 раз медленнее, чем PDF-Sharp, просто чтобы получить количество страниц, используя ваш пример
Одна линия:
int pdfPageCount = System.IO.File.ReadAllText("example.pdf").Split(new string[] { "/Type /Page" }, StringSplitOptions.None).Count()-2;
Рекомендуемые: ITEXTSHARP
Хорошо работает с моими файлами. Это достаточно быстро для моих нужд, но мне интересно, какова производительность по сравнению с решением с регулярными выражениями, опубликованным @Barrett
Так вы говорите: «Вот что я рекомендую, но на самом деле есть способы сделать это лучше»?