在pypandoc(pandoc)中将较大的HTML文件转换为docx的问题

时间:2016-04-07 16:00:19

标签: python html haskell pandoc

我的问题与How to increase heap memory in pandoc execution?有关,但添加了一个特定于Python的组件。

背景:我正在尝试自动生成科学报告。我已经将数据写入HTML文件,我想使用Pandoc.exe(文件转换程序)转换为.docx Word文档。我有一个工作流程来处理带有图像,表格等的小型HTML文件。那个文件是307KB。

当我尝试转换嵌入了多个图形的较大文件(~4.5MB)时,问题就开始了。我一直在使用pypandoc进行转换,如下所示:

import pypandoc
PANDOC_PATH = r"C:\Program Files\RStudio\bin\pandoc"

infile = savepath + os.sep + 'Results ' + name + '.html'
outfile = savepath + os.sep + 'Results ' + name + '.docx'

output = pypandoc.convert(source=infile, format='html', to='docx', \
outputfile=outfile, extra_args=["+RTS", "-K64m", "-RTS"])

但是我遇到了各种各样的错误。一般:

RuntimeError: Pandoc died with exitcode "2" during conversion: 
b"Stack space overflow: current size 33692 bytes.\nUse `+RTS -Ksize -RTS' to increase it.\n"

或者如果我将-Ksize的值调高到256m,就像这样:

RuntimeError: Pandoc died with exitcode "1" during conversion: b'pandoc: out of memory\r\n'

有人可以解释一下发生了什么,在这里,以及我可以解决这个困难的一些方法吗?我想到的一个解决方案就是让我的图像变得更小。我刚刚缩小了像这样的(80 - 500KB)原件,每张图像的宽度和高度取决于它的原始尺寸:

data_uri = base64.b64encode(open(formats[graph][0], 'rb').read()).decode('utf-8')

img_tag = ('<img src="data:image/jpg;base64,{0}" height='+formats[graph][2][0]+'
             width='+formats[graph][2][1]+'>').format(data_uri) 

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

非常感谢user2407038对此的帮助!

最后两个修复程序允许我将我的较大HTML文件转换为pypandoc的docx文件:

第一个,如建议的那样,是

  

增加堆的最大大小,例如将-M2GB添加到extra_args

那是:

output = pypandoc.convert(source=infile, format='html', to='docx', outputfile=outfile, extra_args=["-M2GB", "+RTS", "-K64m", "-RTS"])

增加堆大小后,我仍然遇到第二个问题,所以我不确定解决方案是否有效。 Python返回了如下错误消息:

  

RuntimeError:Pandoc在转换期间死于exitcode“1”:b“pandoc:无法解码字节'\ x91':Data.Text.Internal.Encoding.Fusion.streamUtf8:无效的UTF-8流\ n”

通过改变首先打开html文件的方式来解决这个问题。 将encoding关键字参数设置为'utf8'可以使转换生效:

report = open(savepath + os.sep + 'Results ' + name + '.html', 'w', encoding='utf8')