当我尝试使用Docverter(通过API)将utf-8编码的markdown文件转换为pdf时,我只会丢失非ASCII字符。
有什么解决办法吗?
我想转换.md->.pdf。也许Docverter可以帮助我做.md->.html,然后我可以使用其他库/服务来转换.html->.pdf?
更新(2013年10月14日)
Docverter中布尔选项的问题现在已经解决,因此您现在可以直接从md
转换为pdf
,将选项ascii=true
传递给Docverter。这导致中间HTML使用实体而不是utf-8,因此生成的pdf是可以的
原始答案
经过大量的研究(我也遇到了同样的问题),我发现这个错误出现在Docverter使用Flying Saucer库进行的html->pdf转换中。此转换忽略HTML输入中的任何非ascii字符,即使在meta
标记中将字符集正确设置为utf-8
也是如此。
然而,如果HTML包含ó
等实体,那么Flying Saucer确实包含这些字符,并且假设字体具有正确的编码(库使用的默认字体很好),则在生成的pdf中显示正确的字符(本例中为ó
)。
所以我最终采用了以下方法:
- 使用Docverter转换
.md
->html
- 处理生成的
html
以使用HTML实体,而不是utf-8 - 再次使用Docverter转换
.html
->.pdf
如果您碰巧使用python,步骤2很容易。在这种情况下,以下几行就可以了:
def fixHTML(filename):
f = open(filename, "r")
content = unicode(f.read(), "utf-8") # Reads the file into a unicode string
f.close()
f = open(filename, "w")
f.write(content.encode("ascii", "xmlcharrrefreplace")) # Writes with the fixed encoding
注意:不需要这种复杂的方式,因为pandoc
接受开关--ascii
,这迫使它生成步骤2中获得的HTML。然而,用于布尔选项的Docverter解析器似乎已损坏,因此无法将选项ascii
传递给Docverter。