2

多年来,我们一直在通过我们的应用程序中的 activex 控件读取和写入 pdf 的便笺/注释/注释。我们最近升级到了支持 Unicode 的 Delphi2009。以下是引起问题的原因。

当我们打电话

CAcroPDAnnot.GetContents

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

‚És‚“ú‚É•—Ž×‚ð‚‚‚‚‚½‚ç</p>

对于一串日文字符。

但是,如果我通过 pdf 本身的菜单将 pdf 中的注释保存到数据文件中,它将被写入文件,如下所示

0k^L0Oeå0k~¨ª0'0r0D0_0‰</p>

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

  1. CAcroPDAnnot.GetContents 坏了吗?
  2. 是否有我应该注意的编码方案?
  3. 有没有我可以做的替代方案?

谢谢

4

3 回答 3

2

‚És‚“ú‚É•—Ž×‚ð‚‚‚‚‚½‚ç</p>

那是字符串:

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

在 CP-932 又名 Shift-JIS 编码中,这是一种糟糕但在日本仍然流行的编码。

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

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

于 2009-02-03T17:38:53.313 回答
1

你并没有给我们提供很多信息来处理。

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

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

第三:你是怎么调用方法的?您将结果分配给什么类型的变量?

如果您可以提供注释样本(最好包括非 ASCII 字符),这也可能会有所帮助;对于那个注释:

  • 应该是什么样子(以及它在 Reader 中的样子)
  • 使用 2009 之前版本的 Delphi* 时返回的内容
  • 使用 Delphi 2009 时返回的内容*

(* 最好是(ansi/wide)字符串的 HEX 字节码;但是 Ctrl-F7 检查器的输出应该可以)

那么也许有人可以提供更有意义的答案。

于 2009-02-03T17:21:13.333 回答
0

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

这个问题有几个解决方案:

  • 试试你是否可以升级你的 activeX 组件,以便它支持完整的 unicode 字符串。
  • 使用 AnsiString 而不是 string 与 activeX 组件进行通信。在这种情况下,您仍然可以使用旧界面,但您仍然受到相同的限制。
  • 使用创建 pdf 的其他控件。有很多东西要找,但要准备好更改大部分软件。(一些控件基于 XML 并使用编码。)
于 2009-01-30T21:14:50.477 回答