最近项目中 使用了 wkhtmltohtml 工具, 这个工具转换pdf功能非常方便。但是在python作为命令来调用时有些要注意的地方,另外还有一些和字体相关的问题要注意。
一.字体问题引起的半角空格或 会被显示成空心方块。
这个应该是转换时在系统里找不到相应的字体而导致,或者是生成的系统内字体在其它使用端不存在引发的。这个可以指定一个CSS并给定一个通用的字体来解决。
下面是我在程序里产生一个css,然后在调用 wkhtmltopdf 将css文件路径时指定为--user-style-sheet 参数值就能解决此问题。
with open(css_file, 'w', encoding='utf-8') as f:
f.write(''' @font-face{font-family: "仿宋";src:url("/System/Library/Fonts/Helvetica.ttc")}
* {
font-family: Helvetica !important;
font-weight:normal !important;
}
''')
二.os.system 和 subprocess.call 调用 wkhtmltopdf
1.由于我的程序需要等待pdf完使生成完后,才能往下执行,所以就要选择subprocess.call。两者是有区别的,有兴趣的可以试验一下。
2.调用时还有个问题,如果采用拼接命令方式,刚好wkhtmltopdf 本身所在目录路径有空格的话,就会报错,找不到wkhtmltopdf命令, 这个是python本身的问题。subprocess.call 的cmd参数除了支持str 外,还支持list(只要序列就行) , 采用list方式,把命令及所有参数,转化为列表元素就能避免这个问题了。注意是每个参数和参数值,都要独立元素。
cmd = (WKHTMLTOPDF_PATH,
*(() if sys.platform == 'win32' else ("--user-style-sheet", css_file)),
"--encoding", "utf-8",
"--disable-smart-shrinking",
"--page-width", "%smm" % pagesize[0],
"--page-height", "%smm" % pagesize[1],
"--no-outline",
"--quiet",
"--enable-local-file-access",
"-T", "0",
"-L", "0",
"-B", "0",
"-R", "0",
html_file,
pdf_file
)
# print(cmd)
subprocess.call(cmd,
# shell=True,
creationflags=0x08000000 if sys.platform == 'win32' else 0, # windows下隐藏cmd窗口
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
3.在windows下面subprocess.call 调用默认会弹出命令窗口,执行一次就闪弹一次,影响美观,可以通过 creationflags 来隐藏。
标签:调用,python,wkhtmltohtml,cmd,subprocess,--,call,file From: https://blog.51cto.com/fangkailove/5881793