我有兴趣以编程方式将Excel电子表格/工作簿转换为PDF文件。其他人已经提出并回答了这个问题(参见How to convert Word and Excel documents to PDF programmatically?和convert excel to pdf in python),但这些都没有做我想做的事情:
在我看来,一个简单的方法就是使用内置于MacOS中的“Quick Look”系统。 MacOS有预览任何文档的方法(在Finder中选择它并按空格键)。它还有将事物转换为PDF的方法。应该有一种方法可以使用Apple内置的如何呈现XLS和XLSX文件的知识。我只是不知道如何从命令行使用QuickLook以及如何让它生成PDF输出到文件。
Apple确实提供了一个名为qlmanage
的程序,可用于以编程方式生成HTML文件和PNG,但它会生成一组HTML文件,而不是PDF文件。
答案 0 :(得分:2)
好吧,我想出了一个涉及使用qlmanage
和wkhtmltopdf
的解决方案。基本上,我运行qlmanage来制作HTML,并使用wkhtmltopdf将HTML转换为PDF。不幸的是,HTML页面是以或多或少的随机顺序生成的,所以我需要查看属性列表以确定要放在哪个页面。幸运的是,在我的工作簿中,页面可以进行排序。
#!/usr/bin/python
#
# convert an excel workbook to a PDF on a Mac
#
#
from subprocess import Popen,call,PIPE
import os, os.path, sys
import xml.dom.minidom
import plistlib
if len(sys.argv)==1:
print("Usage: %s filename.xls output.pdf" % sys.argv[0])
exit(1)
if os.path.exists("xdir"):
raise RuntimeError,"xdir must not exists"
os.mkdir("xdir")
call(['qlmanage','-o','xdir','-p',sys.argv[1]])
# Now we need to find the sheets and sort them.
# This is done by reading the property list
qldir = sys.argv[1] + ".qlpreview"
propfile = open("%s/%s/%s" % ('xdir',qldir,'PreviewProperties.plist'))
plist = plistlib.readPlist(propfile)
attachments = plist['Attachments']
sheets = []
for k in attachments.keys():
if k.endswith(".html"):
basename = os.path.basename(k)
fn = attachments[k]['DumpedAttachmentFileName']
print("Found %s -> %s" % (basename,fn))
sheets.append((basename,fn))
sheets.sort()
# Finally use wkhtmltopdf to generate the PDF output
os.chdir("%s/%s" % ('xdir',qldir))
cmd = ['wkhtmltopdf'];
for (basename,fn) in sheets:
cmd.append(fn)
cmd.append(sys.argv[2])
call(cmd)
os.chdir("../..")
call(['/bin/rm','-rf','xdir'])
答案 1 :(得分:1)
无需编写任何代码,我想我可以查看以下内容:
首先安装CUPS-PDF,它是一个通用的后脚本后台系统,直接连接到CUPS,系统OS-X用于打印。它允许您直接打印到pdf,并在打印菜单中显示为另一个打印机选项。安装完成后,您可以使用automator打印任何特定的查找器项目,从主要的自动化工作流程中选择Utilities -> Print Finder Items
,您可以选择要打印的驱动程序,这样您就可以选择CUPS-PDF选项。
您可以将应用保存为Droplet或应用,call from the command line
但是我不确定如何指定参数,比如输入文件,因此可能需要进行一些研究,或者您可能必须接受仅使用automator来获取特定位置的所有finder项目并使用bash移动项目预先。