【问题标题】:Delphi 5 : Total number of page in pdfDelphi 5:pdf中的总页数
【发布时间】:2015-12-10 16:47:18
【问题描述】:

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

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

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

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

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

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

有什么我缺少的解决方案吗?

提前感谢您的帮助!

【问题讨论】:

  • 您的机器上安装了 Adob​​e Acrobat 吗?
  • 你检查过这个PDF Page Count Algorithm 吗?
  • @MartynA :至少安装了 Adob​​e Acrobat Reader,是的。
  • 好吧,有了完整的 Acrobat,您可以使用自动化功能将 Pdf 加载到其中,并像在 Acrobat 中使用其 GUI 一样在代码中对其进行操作。获取页数是微不足道的。自从我使用 Acrobat Reader 自动化以来已经有一段时间了。您可以尝试将其类型库导入 Delphi 并查看一下 - 我肯定在大约 10 年前将它与 D5 一起使用过。
  • @fantaghirocco 我刚刚尝试了您的源代码,它看起来非常符合我的要求。但是我得到了与我自己的实现相同的错误页码......例如,我有一个提到

标签: delphi pdf pdf-parsing


【解决方案1】:

您是否尝试使用PDFLib dll

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

【讨论】:

  • 我还没有尝试过,因为我知道它不能免费用于商业应用程序......(?)
  • @user5334551 是的,它不是免费的,但它可能是目前最好的 pdf 库。而且 iText/iTextSharp 在商业应用程序中也不是免费的。
【解决方案2】:

如果您在用户的 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;

【讨论】:

  • 遗憾的是,此应用程序已部署到数千台计算机上 - 无法为 Acrobat 的许可证付费...感谢您抽出宝贵时间回答!
【解决方案3】:

您是否尝试运行免费的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

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

【讨论】:

  • 感谢您的帮助,谢谢!实际上,当前的解决方案已经分叉了一个 exe(pdftk)。我可能会尝试与 xpdf 进行比较,但我想沉重/缓慢是因为新进程的创建而不是它的执行......我错了吗?
  • 一些快速测试表明,在我的情况下,xpdf 似乎比 pdftk 快(pdftk 平均 150 毫秒又 250 毫秒)。这是一个好的开始,但我更多的是在寻找某种方法来避免创建新进程的繁重......你认为修改源代码和构建 DLL 而不是 exe 会很复杂吗?再一次,我还是谢谢你:)
  • @user5334551 如果有任何帮助,请投票或支持答案。 ;)
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多