实习期间,公司需要从一些html页面生成pdf文件,然后我会找一些用php把html页面封装成pdf文件的类。可以说已经找到了很多方法,比如html2pdf、pdflib、FPDF,都尝试过,但是都没有达到我的要求(主要是不能解决中文乱码和风格排版的问题)。
Pdflib、FPDF fPDF需要编写生成pdf的程序,即它们不支持直接将html页面转换为pdf;Html2pdf可以将Html页面转换为pdf文档,但只能转换简单的html代码。如果你的html内容要由背景新闻编辑排版,那肯定不行。
经过长期的斗争,百度和谷歌搜索已经被使用。经过长时间的寻找,一切都有了回报,终于找到了一个非常有用的方法。以下是隆重的介绍。
它是:wkhtmltopdf,可以直接把任何可以在浏览器中浏览的网页转换成pdf。首先,它不是一个php类,而是一个把html页面转换成pdf的软件(需要安装在服务器上),但它不是一个简单的桌面软件,直接由cmd批量处理,所以可以用php中的shell_exec()函数调用。下面介绍如何使用php js html生成pdf文件(但是,有一个缺陷,它需要在服务器端生成一个缓存文件。如果使用thinkphp框架,可以将缓存文件放在运行时文件夹中进行临时存储)。
1.下载并安装wkhtmltopdf
1.下载地址:http://wkhtmltopdf.org/downloads.html如图所示:
2.各种平台下安装有安装包。如果英语不好,直接翻译到谷歌。让我们以windows7平台为例。我下载的是wkhtmltopdf-0.12.3.2-installer.exe版的stable。我在win7、win8 32位和64位以及win-sever上安装和测试都没有问题。使用系统时,我下载了几个安装包。下载后可以直接安装。请注意安装路径,将在下面使用。
3.安装后需要添加:系统环境变量的变量名后为“Path”;D:wkhtmltopdfbin是您安装的目录。安装后重新启动计算机。下图显示了如何设置环境变量:
打开我的电脑的右键属性
单击高级系统设置
查找高级点击环境变量
在系统变量中找到路径,单击编辑,并将安装位置复制到最后。记得在它前面加个分号!
二、测试使用效果直接输入cmd:wkhtmltopdf http://www.baidu.com/d:website1.pdf(注意中间有空格)。第一个是正在运行的软件的名称(这是不变的)。第二个是网址。第三个是生成的路径和文件名。进入车内后,是否看到生成进度条的提示?祝贺你成功。转到您的生成目录,查看是否有新生成的pdf文件。操作方法:1。用windows键r打开搜索框,输入cmd,然后单击确定
2.直接输入:cmd中的wkhtmltopdf http://www.baidu.com/d:website1.pdf(注意中间有空格)
3.点击回车后会看到进度条,然后会提示转换成功!
4.之后会在对应的位置(也就是刚刚设置的D盘)再找到一个Pdf文件,表示成功
第三,用php调用
用php调用非常简单,只需使用函数shell_exec。如果不能使用函数shell_exec,看看在php.ini中是否禁用(在php.ini中找到函数shell_exec,只需取消注释,一般可以直接使用)。简单的例子:
?PHP shell _ exec(' wkhtmltopdf//www . JB 51 . net/1 . pdf ')?你会发现一个1.pdf文件会在你的php文件的同一个目录下生成
下面的代码给出了一个如何在网站开发中使用它的例子:主要功能是截取网页的一部分,并将其传递给php处理成pdf文档
Html页面代码:
!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www . w3 . org/TR/XHTML 1/DTD/XHTML 1-Transitional . DTD ' html xmlns=' http://www . w3 . org/1999/XHTML ' head script src=' http 3360 js/jquery-2 . 1 . 4 . min . js '/script link rel='样式表' href='css/commonCharset=utf-8' /title荷兰职业考试/title/headbody!-startprint-div class=' right 5 ' div class=' right _ top ' style=' background-image : URL(images/right-di . png);'H3霍兰德测试报告/H3/div class=' print ' input type=' button ' value=' down ' report ' id=' print _ BTN '/div class=' Holland ' h6 MBTI测试结果:ESTJ/H6 div id='chart'/div p .霍兰德是约翰霍普金斯大学心理学教授,美国著名的职业指导专家。在职业兴趣理论的基础上,霍兰德编制了两种职业兴趣量表,即职业偏好量表和自我导向搜索量表。荷兰努力为每个职业兴趣找到两种匹配的职业能力。兴趣测试和能力测试相结合,对职业指导和职业咨询的实际操作起到了促进作用。/p/div table class=' TBL 1 ' t body tr node-type=' toolbar ' TD class=' TBL 11 '领导模式:/TD TD TD class=' TBL 12 ' p直接领导,快速管理(2)利用过去的经验解决问题(3)直接清晰地识别问题的核心(4)非常迅速地做出和执行决策(5)传统领导者,尊重组织的内部层级和成就/p/TD/TD/tr tr node-type=' toolbar ' TD class=' TBL 11 '领导模式33331 快速管理(2)利用过去的经验解决问题(3)直接明确地识别问题的核心(4)非常快速地做出和执行决策(5)传统领导者,尊重组织的内部层级和成就/p/TD/TD/tr tr节点-type=' toolbar' TD class=' tbl11 '领导模型:/TD TD TD class=' TBL 12 ' p直接领导,快速管理(2)利用过去的经验解决问题(3)直接明确地识别问题的核心(4)非常快速地做出和执行决策(5) 尊重组织的内部等级和成就/p/TD/TD/tr节点-type=' toolbar' TD class=' tbl11 '领导模式:/TD TD TD class=' TBL 12 ' p直接领导,快速管理(2)利用过去的经验解决问题(3)直接明确地识别问题的核心(4)非常迅速地做出和执行决策(5)传统领导者,尊重组织的内部等级和成就/p/TD/TD/tr节点-type=' toolbar' TD class=' tbl11 '合适-end print-form action=' pdf . PHP ' method=' post ' name=' HLD _ RES ' id=' hide form ' input type=' hide ' id=' hide _ content ' name=' Html '/form/body script $(function(){///)。开始打印!-end print-intercept bdhtml=window . document . body . inner html;sprnstr='!-start print-';eprnstr='!-end print-';prnhtml=bdhtml . substr(bdhtml . indexof(SPR nstr)17);prnhtml=prnhtml.substring(0,prnhtml . indexof(EPR nstr));//将获得的html代码添加到隐藏域,并将其传递给php文件进行处理$ ('# hide _ content ')。val(“‘prnhtml’”);} );$('#down ')。单击(function(){ $('#hideform '))。submit();});/script/htmlphp页面:
?Php //转换为pdf $ html=$ _ POST[' html '];//开启输出缓冲ob _ start();$html=' link rel='样式表' href=' CSS/common . CSS ' rel=' external nofollow ' rel=' external nofollow ' link rel='样式表' href=' CSS/mycenter . CSS ' rel=' external nofollow ' rel=' external nofollow ' meta http-equiv=' Content-Type ' Content=' text/html;charset=utf-8' /'。$ html//生成的html的样式表路径可以是绝对的,也可以是相对的,也可以将样式表文件复制到临时Html文件的目录,也就是这里的演示文件目录(默认),也可以将样式直接写在html页面中直接传递//$ HTMl=ob _ get _ contents();//$html=$html1。$ html$ filename=' hld//将html页面保存在tmp文件夹中。保存的html临时文件的位置可以是相对路径,也可以是绝对路径。使用相对路径file _ put _ contents ('{$ filename})。html ',$ html)。//清理输出缓冲区,关闭输出缓冲ob _ end _ Clean();//将HTML转换为PDF shell _ exec(' wkhtmltopdf-q { $ filename })。html {$filename}。pdf ');if(file _ exists({ $ filename })。pdf '){页眉(' Content-type : application/pdf ');标题('内容-处置:附件;文件名={$filename}。pdf ');echo file _ get _ contents({ $ filename })。pdf ');//回显“{文件名}”。' pdf ';} else { exit} ?点击页面上的下载按钮,
你有没有弹出下载提示,打开下载的pdf,和网页上的样式一模一样?
然后打开Php文件中的文件保存位置,看看是否还有两个临时文件。
这两个临时文件在哪里,你的css就在哪里,或者你可以直接使用相对路径,引用其他文件的css样式。最简单的就是直接在html页面上写css样式,转换成pdf。
如果没有风格,那么你的风格路径写的不对,随便查查!
第四,解决分页问题
Wkhtmltopdf很有用,但不尽如人意。也就是当一个html页面很长的时候,我需要在指定的地方断页,那么该怎么办呢?Wktmltopdf开发人员在开发时没有考虑到这一点。Wktmltopdf有一个很好的方法,就是在那个div的样式后面加一个page-break-inside :忌;没关系。
例如
div { width:800px最小高度height:1362pxmargin:autopage-break-inside :忌;}
以上是转pdf的个人总结方法,很多地方都可以扩展。让我们动动脑筋,但是一直到现在都没有解决,就是不能用中文名命名文件。如果有合作伙伴可以解决,请在下面留言告诉我们,谢谢!