说起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

    与其他路径用”;”隔开  

  

版权声明:本文为niejinmei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/niejinmei/p/8157680.html