通过wkhtmltopdf导出支持CSS样式的pdf文件

本文介绍了如何通过wkhtmltopdf工具解决PHP项目中下载PDF文件无法识别CSS样式的问题。首先,详细讲解了wkhtmltopdf的下载与安装步骤,强调了安装路径不能含有中文和空格。接着,展示了在PHP中使用shell_exec函数调用wkhtmltopdf进行PDF生成的简单示例,以及如何结合HTML页面和PHP脚本实现在网站上下载带有CSS样式的PDF文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在公司项目中发现有下载pdf文件的功能,但是不能识别CSS样式,导致下载的pdf文件格式显得很别扭,虽然能看但是难看。然后就是百度啊,google啊,最后找到一款能够识别CSS样式的软件—wkhtmltopdf。wkhtmltopdf可以直接把任何一个可以在浏览器中浏览的网页直接转换成一个pdf,首先说明一下它不是一个php 类,而是一个把html页面转换成pdf的一个软件(需要安装在服务器上),但是它并不是一个简单的桌面软件,而且它直接cmd批处理的,使用php中的 shell_exec()函数就可以调用它。

一,下载并安装wkhtmltopdf

1、下载地址:http://wkhtmltopdf.org/downloads.html 如图:
这里写图片描述

2、上面有各种平台下安装的安装包,英文不好的直接谷歌翻译一下。下面以 windows7平台上使用举例,我的下载的是stable(稳定版)的wkhtmltox-0.12.4_msvc2015-win64.exe这个版本。系统时几位就下载几位的安装包。下载好以后直接安装就可以了,注意安装路径要知道路径中不能含有中文和空格,所以不要安装在Program Files目录下,安装路径在下面会用到的。
这里写图片描述

3、安装好以后需要在系统环境变量变量名为”Path”的后添加:;D:\wkhtmltopdf\bin 也就是你安装的目录。安装好以后重启电脑。 这样就可以直接不带安装路径使用了。
这里写图片描述

二、PHP中测试使用效果

php里调用是很简单的,用shell_exec这个函数就可以了,如果shell_exec函数不能用看看php.ini里是否补禁用了(找到php.ini中的shell_exec函数,取消注释就可以了,一般都是可以直接用的)。简单举例:

<?php shell_exec("wkhtmltopdf http://www.baidu.com/ 1.pdf") ?>

你会发现在你php文件的同级目录中会生成一个1.pdf的文件
下面代码举例介绍如何在网站开发中使用它:主要功能是截取网页的部分传递到php中处理成pdf文档
html页面代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <script src="js/jquery-2.1.4.js"></script>
  <link rel="stylesheet" href="css/common.css" rel="external nofollow" rel="external nofollow" >
  <link rel="stylesheet" href="css/myCenter.css" rel="external nofollow" rel="external nofollow" >
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>PHP编程</title>
</head>
<body>
<!--startprint-->
<div class="right5" style="margin: 0px 200px;"> 
    <div class="right_top" style="background-image:url(images/right-di.png);">
      <h2 style="text-align:center">PHP编程</h2>
    </div>
    <div class="print">
      <input type="button" value="下载" id="down" align="right" style="background-color:orange;color:white;text-align:right">
    </div> 
    <div class="Hollander">
        <div style="font-size:20px;">PHP(PHP: Hypertext Preprocessor的缩写,中文名:“超文本预处理器”)</div>
        <div id="chart"></div>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PHP(PHP: Hypertext Preprocessor的缩写,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。PHP的文件后缀名为php。</p>
    </div>  
    <table class="tbl1" style="border:2px solid black;">
      <tr node-type="toolBar">
        <td class="tbl11" style="border:2px solid blue;">php基础:</td>
        <td class="tbl12" style="border:2px solid green;">
          <p>①PHP语言简介 ②PHP程序安装 ③PHP语法了解 ④PHP变量使用 ⑤PHP数据类型分析 ⑥PHP常量使用 ⑦PHP字符串使用 ⑧PHP运算符使用 ⑨PHP数组使用 ⑩PHP数组排序 </p>
        </td>
       </td>
      </tr>
      <tr node-type="toolBar">
        <td class="tbl11" style="border:2px solid blue;">php进阶:</td>
        <td class="tbl12" style="border:2px solid green;">
          <p>①PHP语言简介 ②PHP程序安装 ③PHP语法了解 ④PHP变量使用 ⑤PHP数据类型分析 ⑥PHP常量使用 ⑦PHP字符串使用 ⑧PHP运算符使用 ⑨PHP数组使用 ⑩PHP数组排序 </p>
        </td>
       </td>
      </tr>
      <tr node-type="toolBar">
        <td class="tbl11" style="border:2px solid blue;">php源码:</td>
        <td class="tbl12" style="border:2px solid green;">
          <p>①PHP语言简介 ②PHP程序安装 ③PHP语法了解 ④PHP变量使用 ⑤PHP数据类型分析 ⑥PHP常量使用 ⑦PHP字符串使用 ⑧PHP运算符使用 ⑨PHP数组使用 ⑩PHP数组排序 </p>
        </td>
       </td>
      </tr>
      <tr node-type="toolBar">
        <td class="tbl11" style="border:2px solid blue;">php插件:</td>
        <td class="tbl12" style="border:2px solid green;">
          <p>①PHP语言简介 ②PHP程序安装 ③PHP语法了解 ④PHP变量使用 ⑤PHP数据类型分析 ⑥PHP常量使用 ⑦PHP字符串使用 ⑧PHP运算符使用 ⑨PHP数组使用 ⑩PHP数组排序 </p>
        </td>
       </td>
      </tr>
      <tr node-type="toolBar">
        <td class="tbl11" style="border:2px solid blue;">选择php项:</td>
        <td class="tbl12" style="color:red;border:2px solid green;">
          <a><span>项目介绍>></span></a>
        </td>
       </td>
     </tr>
   </table>  
</div>
<!--endprint-->
  <form action="pdf.php" method="post" name="hld_res" id="hideform">
   <input type="hidden" id="hide_content" name="html"/>
  </form> 
</body>
<script>
  $(function () {
    //获取需要传递的Html代码 通过<!--startprint--><!--endprint-->截取
    bdhtml=window.document.body.innerHTML; 
    sprnstr="<!--startprint-->"; 
    eprnstr="<!--endprint-->"; 
    prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17); 
    prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr)); 
    //将获取的html代码添加到隐藏域中传给php文件处理
    $("#hide_content").val(""+prnhtml+"");
  });  

  $("#down").click(function(){
    // alert('12345');
    $("#hideform").submit();
  }); 

</script>
</html>

php脚本代码:

<?php
    // header("content-type:text/html;charset=utf-8");
    //转成pdf
    $html=$_POST['html'];
    //Turn on output buffering
    // var_dump($html);die;
    ob_start();
    /*这儿引入生成的Html的样式表 
     *路径可以是绝对路径也可以是相对路径.
     *也可以把样式表文件复制到临时html文件的目录下,即这儿的demo文件目录下(默认).
     *也可以直接把样式写在html页面中直接传递过来这儿可以引入生成的Html的样式表.
    */
    // $html='
    // <link rel="stylesheet" href="css/common.css" rel="external nofollow">
    // <link rel="stylesheet" href="css/myCenter.css" rel="external nofollow">
    // <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'.$html;
    $html='<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'.$html;
    //这儿引入生成的Html的样式表 

    //$html = ob_get_contents();
    $filename = "down_report";

    //save the html page in tmp folder 保存的html临时文件位置 可以是相对路径也是可以是绝对路径 下面用相对路径
    file_put_contents("{$filename}.html", $html);

    //Clean the output buffer and turn off output buffering
    ob_end_clean();

    //convert HTML to PDF
    $suc = shell_exec("wkhtmltopdf {$filename}.html {$filename}.pdf");
    // $suc = shell_exec("wkhtmltopdf https://www.baidu.com/ 1.pdf");
    if(file_exists("{$filename}.pdf")){
      header("Content-type:application/pdf");
      header("Content-Disposition:attachment;filename={$filename}.pdf");
      echo file_get_contents("{$filename}.pdf");
      echo "{$filename}.pdf";
    }else{
        echo 'false';
        exit;
    }
?>

点击页面中的下载按钮,即可完成下载:
这里写图片描述

下载下来的文件如下:
这里写图片描述

打开查看效果:
这里写图片描述

部分内容参考与《 最好用Html转pdf的工具——wkhtmltopdf》,具体情况可以看看这篇博文。这里我就自己做一下记录。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值