【问题标题】:Easiest way to read PDF(/A) metadata from a Delphi app?从 Delphi 应用程序读取 PDF(/A) 元数据的最简单方法是什么?
【发布时间】:2011-08-20 06:57:41
【问题描述】:

对于在其嵌入式元数据中包含附加信息(如条形码数据)的PDF/A 文档,是否有一种简单的方法可以从 Delphi 应用程序访问这些信息 - 而不是使用功能齐全的 PDF 阅读器/编写器应用程序库? (例如开源命令行工具)

【问题讨论】:

    标签: delphi pdf metadata


    【解决方案1】:

    据我所知,PDF 元数据仅在 PDF/A 文档中以纯文本形式提供。

    因此您可以在文件中搜索<x:xmpmeta 模式,然后在此处可以找到整个元数据,直到</x:xmpmeta>。然后检索 XML 内容。

    function ExtractPDFMetadata(const aPDFFileName: TFileName): UTF8String;
    var tmp: RawByteString;
        i: integer;
    begin
      with TFileStream.Create(aPDFFileName,fmOpenRead) do 
      try
        SetLength(tmp,Size);
        Read(tmp[1],Size);
      finally
        Free;
      end;
      result := '';
      i := pos('<x:xmpmeta',tmp);
      if i=0 then exit;
      delete(tmp,1,i-1);
      i := pos('</x:xmpmeta>',tmp);
      if i=0 then exit;
      result := copy(tmp,1,i+12);
    end;
    

    然后这个 UTF8String 可以像往常一样用于解析 XML 内容。

    您还可以使用 PDF 目录中的“元数据”类型的条目来定位此 XML 内容:这样会更快(无需解析文件),但需要更多额外的编码。

    【讨论】:

    • 谢谢!流式 XML (SAX) 解析器在这里会很方便:)
    • 请注意,元数据可以被 zlib 或任何其他 PDf 流过滤器压缩。文档指出:元数据流的内容是以可扩展标记语言 (XML) 表示的元数据。仅当元数据流未过滤且未加密时,此信息才会以纯文本形式显示给不支持 PDF 的工具。另外:PDF/A 标准未指定此流应保持未压缩 --> 因此:这可能不适用于所有 PDF/A 文档。
    • AFAIK 为了有效,根据 PDF/A 标准,不应压缩 XML 元数据。至少,一些 PDF/A 验证器期望这一点。
    • @Arnaud:我从未见过带有压缩元数据流的,但标准规定: 6.1.5 文档信息字典 文档信息字典可以在符合标准的文件中定义。如果定义,其元素应与 6.7.3 中规定的类似 XMP 元数据属性一致。并与 PDF 标准一起使用 FlateDecode 流过滤器..
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2010-09-30
    相关资源
    最近更新 更多