【问题标题】:Unicode symbols in iTextSharp relative linkiTextSharp 相对链接中的 Unicode 符号
【发布时间】:2019-04-15 07:30:50
【问题描述】:

我正在尝试在使用 iTextSharp 创建的 pdf 文件中创建相对链接

ASCII 字母一切正常,但如果我在路径中添加其他 unicode 符号,它们就会被跳过

这很好用:

Chunk chunk = new Chunk(text, font);
chunk.SetAnchor("./Attachments/1.jpg");

这会创建不正确的链接(链接是这样创建的://1.jpg,Вложения - 部分缺失):

Chunk chunk = new Chunk(text, font);
chunk.SetAnchor("./Вложения/1.jpg");

有没有办法用 unicode 符号创建正确的链接? 谢谢

【问题讨论】:

  • 您在执行 pdf 转换的机器上安装了正确的字体吗?听起来您缺少所需的字体。
  • @RossBush 我不明白安装字体是什么意思?我电脑上的文件管理器支持这种路径
  • 某些字体(如 WingDings2)可能会或可能不会安装在呈现文本的服务器上。如果缺少字体,您经常会看到奇怪的方块或其他异常。您使用什么操作系统来呈现 PDF?
  • @RossBush 我在那里使用了 Arial,但是,这种字体用于在 pdf 中写入“文本”参数并且没有问题,问题在于该文本“后面”的链接跨度>
  • 对不起,罗斯,但你是在胡闹。字体与它无关。我更倾向于按照 pdf 规范的思路来考虑链接目标中的非 ascii 字符。我不知道,我必须在我们办公室的 pdf 参考资料中查找它,我相信我的同事甚至不必查找它,但我非常相信链接目的地确实没有字体。

标签: c# pdf unicode itext


【解决方案1】:

通过在 iText 5 中使用 Chunk.SetAnchor,您可以有效地生成 URI 操作。其URI参数指定为

URI ASCII 字符串 (必填)要解析的统一资源标识符,以 7 位 ASCII 编码。

(ISO 32000-1,表 206 - 特定于 URI 操作的附加条目)

因此,Chunk.SetAnchor 不接受像西里尔字母这样的非 ASCII 字符是可以的。 (不过,将它们简单地删除是不行的;如果方法不接受其输入,它应该抛出异常。)

但这绝不意味着您不能在使用某些非 ASCII 字符的路径中引用文件。相反,您可以利用路径被视为 URI 的事实:这尤其意味着您可以将 URL 编码方案应用于特殊字符!

因此,只需替换

chunk.SetAnchor("./Вложения/1.jpg");

通过

chunk.SetAnchor(WebUtility.UrlEncode("./Вложения/1.jpg"));

您的链接又可以使用了! (至少在我的测试中是这样。)


PS:在 .Net 中,您实际上可以选择很多类来进行 URL 编码,参见。例如this answerWebUtility.UrlEncode 在手头的案例中为我工作,但根据您的用例,其他一个可能更合适。


PPS:在较新的 PDF 规范中情况有所改变:

URI ASCII 字符串 (必需) 要解析的统一资源标识符,以 UTF8 编码。

(ISO 32000-2,表 210 - 特定于 URI 操作的附加条目)

(我认为type栏中的“ASCII”是规范错误,value栏中的UTF8要认真对待。)

但 iText 5 不支持 PDF 2.0,因此此处不支持 UTF8 编码。应该使用声称支持 PDF 2.0 的 iText 7 进行测试...

【讨论】:

  • 谢谢,这对我有用。我用System.Web.HttpUtility.UrlPathEncode,因为我用的是.Net 4.0
猜你喜欢
  • 2011-06-29
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
相关资源
最近更新 更多