【问题标题】:Mac: How to convert Excel (and other) file types to PDF programmaticallyMac:如何以编程方式将 Excel(和其他)文件类型转换为 PDF
【发布时间】:2011-07-13 13:11:35
【问题描述】:

我对以编程方式将 Excel 电子表格/工作簿转换为 PDF 文件感兴趣。其他人已经提出并回答了这个问题(参见 How to convert Word and Excel documents to PDF programmatically? 和 convert excel to pdf in python),但他们都没有做我想做的事情:

  1. 我想要一个不需要使用 Microsoft Office 的命令行工具。
  2. 我希望它可以在 Mac 上运行。
  3. 我想让它做完整的电子表格; Perl 解决方案只做常量。
  4. 我想使用已经调试过的东西,而不是编写代码。

在我看来,一个简单的方法应该是使用 MacOS 中内置的“快速查看”系统。 MacOS 有预览任何文档的方法(在 Finder 中选择它并按下空格)。它还具有将内容转换为 PDF 的方法。应该有一种方法可以使用 Apple 内置的关于如何渲染 XLS 和 XLSX 文件的知识。我只是不知道如何从命令行使用 QuickLook 以及如何让它生成 PDF 输出到文件。

Apple 确实提供了一个名为 qlmanage 的程序,可用于以编程方式生成 HTML 文件和 PNG,但它生成的是一组 HTML 文件,而不是 PDF 文件。

【问题讨论】:

  • 如果您不编写任何代码,这似乎更像是一个超级用户问题。
  • 我正在写很多代码。我想以编程方式执行此操作。但我不想重写别人写的代码。 ...

标签: excel macos pdf-generation xls


【解决方案1】:

不写任何代码,我想我可能会检查以下内容:

首先安装CUPS-PDF,这是一个通用的后脚本后台系统,直接连接到 CUPS,OS-X 用于打印的系统。它允许您直接打印到 pdf,并在打印菜单中显示为另一个打印机选项。安装后,您可以使用 automator 打印任何特定的 finder 项目,从 automator 主工作流程面板中,选择 Utilities -> Print Finder Items,然后您可以选择要打印的驱动程序,因此您可以选择 CUPS-PDF 选项。

您可以将应用保存为 Droplet 或应用程序和call from the command line

但我不确定如何指定参数,例如输入文件,因此这可能需要进行一些研究,或者您可能不得不接受仅使用 automator 将所有查找器项目放在特定位置并使用 bash 将项目移动到那里提前。

【讨论】:

  • 这也是一个非常酷的想法。我一直无法理解applescript——尤其是像Microsoft Excel这样的程序。但我会对其进行调查,因为使用 Microsoft 代码进行渲染会获得更高的保真度。谢谢。
【解决方案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'])

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 2020-05-06
    • 2011-01-30
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2023-03-16
    • 2010-10-27
    相关资源
    最近更新 更多