2

我正在维护一个使用 Delphi 5 构建的旧应用程序。我需要确定给定 pdf 文件中的总页数。

我想我也可以为纯 C 翻译任何解决方案。

我目前的解决方案是分叉一个 pdftk 进程,并解析它的输出。但这很慢,所以我想知道是否可以为delphi(5 ...)找到一个好的开源pdf解析器库......而且它似乎不存在。

所以我尝试实现诸如查看文件的原始内容以查找“/Type /Page”或“/Count”或“Linearized ... /N”的出现。但是这些方法——也不是它们的组合——在每种情况下都不起作用。

所以我想知道是否可以从 Delphi 5 中找到可以使用的开源 DLL。但我也找不到。我偶然发现了 iTextSharp,但它适用于 .NET,我不明白如何在普通的 delphi5 程序中使用它......

所以我最后的想法是:有什么改变我可以找到-say-pdftk的源代码并将其编译为DLL吗?谁能指出我正确的方向?

我有什么解决方案吗?

我提前感谢您的帮助!

4

3 回答 3

1

您是否尝试使用PDFLib dll

它是一个非常高效的库,它们通过 COM 或通过它们的 dll 对 Delphi 进行了绑定。我猜你可以在这个库中使用 Delphi 5。

于 2015-09-14T17:50:24.540 回答
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

所以在这里你有你的页数。而且速度非常快。

于 2015-09-15T13:01:54.437 回答
0

如果您在用户的 PC 上安装 adobe acrobat(不是阅读器),那么您可以使用 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;
于 2015-09-14T22:48:40.487 回答