Delphi acrobat如何对添加为PDF便笺的注释进行编码?

Delphi acrobat如何对添加为PDF便笺的注释进行编码?,delphi,delphi-2009,acrobat,Delphi,Delphi 2009,Acrobat,多年来,我们一直在应用程序中通过activex控件向PDF阅读和撰写便笺/注释/评论。我们最近升级到Delphi2009,支持Unicode。以下是导致问题的原因 当我们打电话时 CAcroPDAnnot.GetContents 结果似乎很奇怪,我们丢失了Unicode字符。这不像保存为ansi字符串,通常会导致返回?????相反,我们得到一个字符串,比如 ÉsÉÉÉ•-Ž×ðÐ 对于一个日语字符字符串 但是,如果我通过pdf本身的菜单将pdf中的注释保存到数据文件中,它会像这样写入文件中 0k

多年来,我们一直在应用程序中通过activex控件向PDF阅读和撰写便笺/注释/评论。我们最近升级到Delphi2009,支持Unicode。以下是导致问题的原因

当我们打电话时

CAcroPDAnnot.GetContents

结果似乎很奇怪,我们丢失了Unicode字符。这不像保存为ansi字符串,通常会导致返回?????相反,我们得到一个字符串,比如

ÉsÉÉÉ•-Ž×ðÐ

对于一个日语字符字符串

但是,如果我通过pdf本身的菜单将pdf中的注释保存到数据文件中,它会像这样写入文件中

0kˆL0Oeå0k¨0'r0d0_0€

后者可以导出并重新导入到acrobat pdf中,并将重新创建正确的unicode字符。但是,一旦我在代码中调用CAcroPDAnnot.GetContents,它就会以其他形式返回

  • CAcroPDAnnot.GetContents是否已损坏
  • 是否有我应该知道的编码方案
  • 我有没有别的选择

  • 谢谢

    好的,Delphi 2009和早期版本之间的主要区别之一是默认字符串类型是unicode字符串。这意味着如果您使用与早期版本相同的ActiveX组件,则将unicode字符串传递给ascii字符串,这通常不是一个好主意

    此问题有两种解决方案:

    • 如果可以升级activeX组件以使其支持完整的unicode字符串,请尝试
    • 使用AnsiString和not string与activeX组件通信。在这种情况下,您仍然可以使用旧的接口,但仍然受到相同的限制
    • 使用另一个创建pdf的控件。有很多东西需要查找,但要准备好更改软件的大部分内容。(有些控件是基于XML的,并且使用编码。)

      • 您并没有给我们提供很多信息

        我想你在这里谈论的是“Acrobat.CAcroPDAnnot”类的GetContents方法。你使用的是哪一版本的Acrobat?在开始使用Delphi 2009编程时,你是否切换过版本(或运行更新)

        然后:您是如何实例化该对象的?如果使用从DLL生成的*\u TLB.pas文件,您确定它仍然匹配吗?(如果不确定,请尝试重新生成它)

        第三:您如何调用该方法?您将结果分配给哪种类型的变量

        如果您可以提供注释的示例(最好包括非ASCII字符),那么也可能有所帮助;对于该注释:

        • 它应该是什么样子(以及它在读卡器内部看起来是什么样子)
        • 使用2009年以前版本的Delphi时返回的内容*
        • 使用Delphi 2009时返回的内容*
        (*最好是(ansi/wide)字符串的十六进制字节码;但Ctrl-F7检查器的输出应该可以)

        也许有人能提供一个更有意义的答案

        ÉsÉÉÉ•-Ž×ðÐ

        这就是字符串:

        に行く日に風邪をひいたら

        在CP-932 aka Shift JIS编码中,这是一种可怕但令人遗憾的在日本仍然流行的编码

        您当前正在将其解释为CP-1252(Windows西欧版)。如果您的PDF阅读组件无法自动转换,您需要找到一种方法来检测文档的编码并手动转换


        我不知道Delphi为读取编码提供了什么,但是您是否已经从“控制面板”->“区域选项”->“东亚语言安装文件”中获得了Windows中安装的Shift JIS编码选项?如果没有,这也许可以解释为什么它无法自动转换。

        只是暗中猜测。CAcroPDAnnot.GetContents上的返回类型是什么,您以前是如何管理的?ansi便笺是否仍然有效?我想知道这些便笺是否以UTF-8的形式返回,因此您必须稍微不同地处理它们在Delphi 2009中。我们以前不需要管理它,因为它是ascii字符和未编码的。我可能在2009年必须以不同的方式处理它,但到目前为止,我不知道如何处理它。