2015-09-14 15 views
2

Я поддерживаю старое приложение, которое построено с помощью Delphi 5. Мне нужно определить общее количество страниц в данном pdf-файле.Delphi 5: Общее количество страниц в pdf

Я думаю, я мог бы перевести любое решение для простой C тоже.

Текущее решение, которое у меня есть, - это форматирование процесса pdftk и анализ его вывода. Но это довольно медленно, поэтому мне было интересно, могу ли я найти хорошую библиотеку парсера PDF с открытым исходным кодом для delphi (5 ...) ... И кажется, что ее не существует.

Итак, я попытался реализовать такие вещи, как поиск сырого содержимого файла для «/ Type/Page» или «/ Count» или «Linearized .../N». Но ни одно из них - или их комбинация - не работают в каждом случае.

Так что я задавался вопросом, могу ли я найти DLL с открытым исходным кодом, которую я мог бы использовать из Delphi 5. Но я не мог найти ни одного. Я наткнулся на iTextSharp, но это для .NET, и я не понимаю, как использовать его в простой программе delphi5 ...

Итак, моя последняя мысль такова: есть ли какие-либо изменения, я мог бы найти исходный код для - say-pdftk и скомпилировать его как DLL? Может ли кто-нибудь указать мне в правильном направлении?

Есть ли какое-либо решение, которое мне не хватает?

Я благодарю вас за вашу помощь!

+0

У вас установлен Adobe Acrobat на машине? – MartynA

+0

Вы уже проверили этот [PDF Count Count Algorithm] (http://angusj.com/delphitips/pdfpagecount.php)? – fantaghirocco

+0

@MartynA: По крайней мере, установлен Adobe Acrobat Reader, да. – Highbrainer

ответ

1

Вы пытались использовать PDFLib dll?

Это очень эффективная библиотека, и у них есть привязка для Delphi, либо через COM, либо через их DLL. Думаю, вы могли бы использовать Delphi 5 с этой библиотекой.

+0

Я еще не пробовал, потому что понимаю, что он не является бесплатным для использования в коммерческом приложении ... (?) – Highbrainer

+0

@ user5334551 Да, это не бесплатно, но это, вероятно, лучшая библиотека PDF. И iText/iTextSharp НЕ бесплатны ни в коммерческом приложении. –

0

Если вы устанавливаете adobe acrobat (not reader) на ПК пользователя, вы можете использовать автоматизацию OLE.

Вот пример того, как открыть файл и читать подсчет страниц:

uses 
     ComObj, ActiveX; 

    function TmyForm.IsOLEObjectInstalled(Name: String): Boolean; 
    var 
     ClassID: TCLSID; 
     Rez: HRESULT; 
    begin 
     Rez := CLSIDFromProgID(PWideChar(WideString(Name)), ClassID); 

     Result := (Rez = S_OK); 
    end; 

    procedure TmyForm.ButtonCheckPagesClick(Sender: TObject); 
    var 
     doc: OleVariant; 
     pagesCount: Integer; 
    begin 
     if IsOLEObjectInstalled('AcroExch.PDDoc') then 
     begin 
     doc := CreateOleObject('AcroExch.PDDoc'); 

     if doc.Open('C:\test\test.pdf') then 
     begin 
      pagesCount := doc.GetNumPages; 
      ShowMessageFmt('pages count = %d', [pagesCount]); 
     end 
     else 
     begin 
      ShowMessage('Can''t open file'); 
     end; 
     end 
     else 
     begin 
     ShowMessage('You must install adobe acrobat for that feature'); 
     end; 
    end; 
+0

К сожалению, это приложение развертывается на тысячах компьютеров - оплата лицензии Acrobat не является вариантом ... Спасибо, что нашли время, чтобы ответить в любом случае! – Highbrainer

1

ли вы пытаетесь запустить бесплатный pdfinfo инструмент?

Скачать его из http://www.foolabs.com/xpdf

Он возвращает такую ​​информацию:

Title:   Optimizing software in C++ 
Keywords:  software C++ optimization compiler 
Author:   Agner Fog 
Creator:  Microsoft® Word 2013 
Producer:  Microsoft® Word 2013 
CreationDate: 12/15/14 14:25:13 
ModDate:  12/15/14 14:25:13 
Tagged:   yes 
Form:   none 
Pages:   37 
Encrypted:  no 
Page size:  595.32 x 841.92 pts (A4) (rotated 0 degrees) 
File size:  531693 bytes 
Optimized:  no 
PDF version: 1.5 

Так вот у вас есть несколько страниц. И это очень быстро.

+0

Я ценю вашу помощь, спасибо! На самом деле текущее решение уже расширяет exe (pdftk). Я могу попытаться сравнить с xpdf, но я предполагаю, что тяжесть/медленность обусловлена ​​новым процессом, а не его исполнением ... Я ошибаюсь? – Highbrainer

+0

Некоторые быстрые тесты показывают, что в моем случае xpdf кажется быстрее, чем pdftk (в среднем 150 мс снова 250 мс для pdftk). Это хороший старт, но я больше искал способ избежать тяжести создания нового процесса ... Считаете ли вы, что было бы сложно изменить источники и построить DLL вместо exe? Опять же, я благодарю вас в любом случае :) – Highbrainer

+0

@ user5334551 Если бы какая-либо помощь, пожалуйста, проголосуйте или подтвердите ответ. ;) –