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

Python 在pypandoc(pandoc)中将较大的HTML文件转换为docx时出现的问题,python,html,haskell,pandoc,Python,Html,Haskell,Pandoc,我的问题与Python相关,但添加了一个特定于Python的组件 背景:我正在尝试自动生成科学报告。我已经将数据写入HTML文件,我想使用Pandoc.exe(一个文件转换程序)转换为.docx Word文档。我已经有了处理带有图像、表格等的较小HTML文件的过程。那个文件是307KB 当我试图转换一个包含多个图形的较大文件(~4.5MB)时,问题就出现了。我一直在使用pypandoc进行转换,如下所示: import pypandoc PANDOC_PATH = r"C:\Program Fi

我的问题与Python相关,但添加了一个特定于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 "1" during conversion: b'pandoc: out of memory\r\n'
但是我有很多错误。通常:

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,如下所示:

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 "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) 
data\u uri=base64.b64编码(打开(格式[graph][0],'rb').read()).decode('utf-8'))
img_标记=(“”).format(数据uri)

感谢您的帮助

非常感谢您在这一次的帮助

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

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

增加堆的最大大小,例如将-M2GB添加到额外的参数

即:

output=pypandoc.convert(source=infle,format='html',to='docx',
outputfile=outfile,额外参数=[“-M2GB”、“+RTS”、“-K64m”、“-RTS”])


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

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 "1" during conversion: b'pandoc: out of memory\r\n'
运行时错误:转换期间,Pandoc与exitcode“1”一起死亡:b“Pandoc:无法解码字节'\x91':Data.Text.Internal.Encoding.Fusion.streamUtf8:无效的UTF-8流\n”

这是通过改变html文件的打开方式修复的。 将
编码
关键字参数设置为
'utf8'
允许转换工作:

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

我无法解释为什么会发生这种情况(“what”很明显-程序试图使用比可用内存更多的内存),但您可以尝试通过增加堆的最大大小来绕过它,例如,将
-M2GB
添加到
额外参数
。感谢您的建议。。。我希望我能验证它是否有效。。。不幸的是,我遇到了另一个错误:
RuntimeError:Pandoc在转换过程中因exitcode“1”而死亡:b“Pandoc:无法解码字节'\\x91':Data.Text.Internal.Encoding.Fusion.streamUtf8:无效的UTF-8流\n”
可能与嵌入的图片有关?为什么要嵌入图像而不是将它们放在目录中并引用它们?这是一个大大增加文件大小(和pandoc内存消耗)的黑客…@mb21尝试直接引用它们,但pandoc在查找文件时遇到困难,转换失败。仍在努力完成这项任务,因此非常欢迎您的想法