PDF之pdfkit

Posted karina梅梅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PDF之pdfkit相关的知识,希望对你有一定的参考价值。

  说起pdf就想到了一款很适用的工具,那就是pdfkit,在前几天的项目中,有一个功能要实现,为了实现这一个功能,于是我大海茫茫中查询各种百科,不负众望的让我找到了我心怡的工具,想必也就是它了。好了废话也不多说了,开始进入高潮部分吧~~~

  1、说明

    pdfkit,把html·+ CSS格式的文件转换成PDF格式文档的一种工具。

    其实,它就是html转换成PDF工具包wkhtmltopdf的Python封装,所以,必须安装wkhtmktopdf。一般情况下,wkhtmkltopdf需要手动安装,尤其要注意的是Windows下,需要把wkhtmltopdf的bin执行文件路径添加到PATH变量中。

  2、安装

    请参考《Python抓取网页并保存为PDF》里面各个安装包的安装

  3、API说明   

def from_url(url, output_path, options=None, toc=None, cover=None, configuration=None, cover_first=False): 
    """ 
    把从URL获取文件转换为PDF文件 

    :param url:
    URL 或 URL列表 
    :参数,output_path: 
    输出PDF文件的路径。如果是参数等于False,意味着文件将会以字符串的形式返回,得到文本文件。
    :param options: 
    (可选) dict with wkhtmltopdf global and page options, with or w/o ‘--‘ 
    :param toc: 
    (可选) dict with toc-specific wkhtmltopdf options, with or w/o ‘--‘ 
    :param cover: 
    (可选) string with url/filename with a cover html page 
    :param configuration: 
    (可选)实例化 pdfkit.configuration.Configuration() 
    :param configuration_first: 
    (optional) if True, cover always precedes TOC 

    返回值:成功返回True 
    """ 
    r = PDFKit(url, ‘url‘, options=options, toc=toc, cover=cover,configuration=configuration, cover_first=cover_first) 
    return r.to_pdf(output_path) 

 

def from_file(input, output_path, options=None, toc=None, cover=None, css=None, configuration=None, cover_first=False): 
    """ 
    Convert HTML file or files to PDF document 
    :param input: 
    path to HTML file or list with paths or file-like object  
    :param output_path: 
    path to output PDF file. False means file will be returned as string. 
    :param options: 
    (optional) dict with wkhtmltopdf options, with or w/o ‘--‘
    :param toc: 
    (optional) dict with toc-specific wkhtmltopdf options, with or w/o ‘--‘ 
    :param cover: 
    (optional) string with url/filename with a cover html page 
    :param css: 
    (optional) string with path to css file which will be added to a single input file 
    :param configuration: 
    (optional) instance of pdfkit.configuration.Configuration() 
    :param configuration_first: 
    (optional) if True, cover always precedes TOC 
    Returns: True on success 
    """ 
    r = PDFKit(input, ‘file‘, options=options, toc=toc, cover=cover, css=css, configuration=configuration, cover_first=cover_first) 
    return r.to_pdf(output_path) 

  

def from_string(input, output_path, options=None, toc=None, cover=None, css=None, configuration=None, cover_first=False):
    """
    Convert given string or strings to PDF document
    :param input: string with a desired text. Could be a raw text or a html file
    :param output_path: path to output PDF file. False means file will be returned as string.
    :param options: (optional) dict with wkhtmltopdf options, with or w/o ‘--‘
    :param toc: (optional) dict with toc-specific wkhtmltopdf options, with or w/o ‘--‘
    :param cover: (optional) string with url/filename with a cover html page
    :param css: (optional) string with path to css file which will be added to a input string
    :param configuration: (optional) instance of pdfkit.configuration.Configuration()
    :param configuration_first: (optional) if True, cover always precedes TOC
    Returns: True on success
    """

    r = PDFKit(input, ‘string‘, options=options, toc=toc, cover=cover, css=css, configuration=configuration, cover_first=cover_first)

    return r.to_pdf(output_path)

 

   4、举例说明

   4.1 简单的例子    

import pdfkit 

pdfkit.from_url(‘https://www.google.com.hk‘,‘out1.pdf‘)    
pdfkit.from_file(‘123.html‘,‘out2.pdf‘)   
pdfkit.from_string(‘Hello!‘,‘out3.pdf‘)

  也可以传递一个url或者文件名列表: 

pdfkit.from_url([‘https://www.google.com.hk‘,‘https://baidu.com‘,‘http://cn.bing.com/‘],‘out_0.pdf‘)    
pdfkit.from_file([‘122.html‘,‘123.html‘],‘out_1.pdf‘)

  如何你想对生成的PDF作进一步处理,你可以将其读取到一个变量中: 

pdf=pdfkit.from_url(‘https://www.google.com.hk‘,False)

  你可以指定所有的 wkhtmltopdf选项 。你可以移除选项名字前面的 ‘–’ .如果选项没有值, 使用None, False或者“*”作为字典值:

在views视图中可以加上options进行页面布局调试 

options = {
    ‘page-size‘:‘Letter‘,
    ‘margin-top‘:‘0.75in‘,
    ‘margin-right‘:‘0.75in‘,
    ‘margin-bottom‘:‘0.75in‘,
    ‘margin-left‘:‘0.75in‘,
    ‘encoding‘:"UTF-8",
    ‘no-outline‘:None
}
pdfkit.from_url(‘https://www.google.com.hk‘,‘out1.pdf‘,options=options)

  默认情况下, PDFKit 将会显示所有的wkhtmltopdf输出. 如果你不想看到这些信息,你需要传递一个quiet选项:

options = {‘quiet‘:‘‘}
pdfkit.from_url(‘https://www.google.com.hk‘,‘out1.pdf‘,options=options)

   由于wkhtmltopdf的命令语法 ,TOC和Cover选项必须分开指定: 

toc={‘xsl-style-sheet‘:‘toc.xsl‘}
cover=‘124.html‘
pdfkit.from_file(‘122.html‘, options=options, toc=toc, cover=cover)

   当你转换文件、或字符串的时候,你可以通过css选项指定扩展的 CSS 文件。

css=‘example.css‘
pdfkit.from_file(‘file.html‘, options=options, css=css)
# Multiple CSS files
css=[‘example.css‘,‘example2.css‘]    
pdfkit.from_file(‘file.html‘, options=options, css=css)

  配置 
       每个API调用都有一个可选的参数。这应该是pdfkit.configuration() API 调用的一个实例。采用configuration 选项作为初始化参数。可用的选项有: 
       wkhtmltopdf——wkhtmltopdf二进制文件所在的位置。默认情况下pdfkit会尝试使用which(在类UNIX系统中) 或where(在Windows系统中)来判断。 
       meta_tag_prefix–pdfkit的前缀指定 meta tags(元标签) - 默认情况是pdfkit- 
       示例 :针对wkhtmltopdf不在系统路径中(不在$PATH里面)  

config=pdfkit.configuration(wkhtmltopdf=‘/opt/bin/wkhtmltopdf‘))   

pdfkit.from_string(html_string, output_file, configuration=config)

 

配置文件路劲是你当时下载wkhtmltopdf安装的路径,然后把它加入在里面,‘‘out.pdf‘‘可以更改名字,属于pdf文件名。

config = pdfkit.configuration(wkhtmltopdf=‘C:\\Python27\\wkhtmltopdf\bin\\wkhtmltopdf.exe‘)
pdfkit.from_url(‘http://google.com‘, ‘out.pdf‘)

 

为了在前端一点击生成pdf下面就是显示pdf文件直接点击查看

#pdf版本导入
def html_str(html_str):
    import pdfkit
    print "in export pdf"
    options = {
        ‘page-size‘: ‘A3‘,
        ‘margin-top‘: ‘0.75in‘,
        ‘margin-right‘: ‘0.75in‘,
        ‘margin-bottom‘: ‘0.75in‘,
        ‘margin-left‘: ‘0.75in‘,
        ‘encoding‘: "UTF-8",
        ‘no-outline‘: None
    }
    # css = {}
    config = pdfkit.configuration(wkhtmltopdf=‘D:\\pdf\\wkhtmltopdf\\bin\\wkhtmltopdf.exe‘)
    file = pdfkit.from_string(html_str, False, options=options, configuration=config)#字符串方式
    return file

 里面还运用到了django 模板渲染功能,如果是使用字符串方式的话,可以使用这个方法,简单方便。。。。

#pdf调用方式
def export_pdf(request, pk):
      quotation_id = pk
       t = TemplateResponse(request, ‘quotation.html‘, locals())
       t.render()
       # print t.content
       file = html_str(t.content)
       response = StreamingHttpResponse(file)
       response[‘Content-Type‘] = ‘application/octet-stream‘
       response[‘Content-Disposition‘] = ‘attachment;filename="product.pdf"‘
      return response  

 ps:

  win7 64位系统下,

  第一步:

  下载下面链接中

  https://wkhtmltopdf.org/downloads.html

Windows (MinGW)	0.12.4	32-bit / 64-bit	for Windows XP/2003 or later; standalone
pip install pdfkit    

  安装到路径:

  D:\software\wkhtmltopdf

    打开控制面板

    系统变量Path中加入

  D:\software\wkhtmltopdf\bin

    与其他路径用";"隔开  

  

以上是关于PDF之pdfkit的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上使用 PDFKit.PDFView 打开 PDF

在节点 js 中使用 pdfkit 不会改变 PDF 页面大小

在节点 js 中使用 pdfkit 指定 PDF 页面大小

使用 PDFKit 打印 PDF。(目标 C)

如何使用 PDFkit 检测滚动到 PDF 中的另一个页面

使用 PDFKit 编辑 PDF