You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP新手技术求助:使用TCPDF将单个Div内的HTML表格生成PDF失败问题排查

解决TCPDF生成PDF失败的问题

别担心,单个PHP文件完全能搞定这个需求,你的代码里有几个容易忽略的小问题,我帮你梳理并修正:

先看几个关键错误点:

  • TCPDF常量拼写错误:你写的PDG_PAGE_ORIENTATION是笔误,应该是PDF_PAGE_ORIENTATION(少了个F),这会直接导致TCPDF初始化失败。
  • HTML标签语法错误:你在PDF生成部分硬编码的HTML表格里,所有<tr>都没有闭合(只有<tr>开头,没有</tr>结尾),TCPDF解析错误的HTML时会出现异常。
  • HTTP头输出顺序问题:原代码先输出了完整的HTML页面,然后才处理PDF生成逻辑。当用户点击提交按钮后,服务器已经先发送了HTML的HTTP头,此时TCPDF再尝试发送PDF的Content-Type头就会失效,导致PDF无法正常渲染。
  • 重复硬编码数据:明明已经有动态解析JSON生成表格的逻辑,没必要在PDF部分写死数据,复用动态生成的HTML更高效且不易出错。

修正后的完整代码:

<?php
$askPriceBeds = '{"status":"success","postcode":"W14 9JH","postcode_type":"full","url":"https://propertydata.co.uk/draw?input=W14+9JH","bedrooms":2,"data":{"points_analysed":20,"radius":"0.09","average":657495,"70pc_range":[ 575000, 725000 ],"80pc_range":[ 550000, 875000 ],"90pc_range":[ 550000, 925000 ],"100pc_range":[ 525000, 950000 ],"raw_data":[ {"price":650000,"lat":"51.48887000","lng":"-0.20776000","bedrooms":2,"type":"flat","distance":"0.00" }, {"price":575000,"lat":"51.48884800","lng":"-0.20701200","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":615000,"lat":"51.48851000","lng":"-0.20742000","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":640000,"lat":"51.48932000","lng":"-0.20804000","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":725000,"lat":"51.48843100","lng":"-0.20775400","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":699950,"lat":"51.48928000","lng":"-0.20793700","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":550000,"lat":"51.48941000","lng":"-0.20832000","bedrooms":2,"type":"flat","distance":"0.04" }, {"price":600000,"lat":"51.48813700","lng":"-0.20781600","bedrooms":2,"type":"flat","distance":"0.05" }, {"price":925000,"lat":"51.48948300","lng":"-0.20827400","bedrooms":2,"type":"flat","distance":"0.05" }, {"price":650000,"lat":"51.48824900","lng":"-0.20669000","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":700000,"lat":"51.48941200","lng":"-0.20666900","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":625000,"lat":"51.48817000","lng":"-0.20689500","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":645000,"lat":"51.48822500","lng":"-0.20872100","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":675000,"lat":"51.48877800","lng":"-0.20643200","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":525000,"lat":"51.48978800","lng":"-0.20864000","bedrooms":2,"type":"flat","distance":"0.07" }, {"price":700000,"lat":"51.48785100","lng":"-0.20757600","bedrooms":2,"type":"flat","distance":"0.07" }, {"price":675000,"lat":"51.48819900","lng":"-0.20637900","bedrooms":2,"type":"flat","distance":"0.08" }, {"price":875000,"lat":"51.48818700","lng":"-0.20931800","bedrooms":2,"type":"flat","distance":"0.08" }, {"price":550000,"lat":"51.48891000","lng":"-0.20955000","bedrooms":2,"type":"flat","distance":"0.08" }, {"price":950000,"lat":"51.48808300","lng":"-0.20628500","bedrooms":2,"type":"flat","distance":"0.09" } ] },"process_time":"2.08"}';
$data = json_decode($askPriceBeds, true);
$raw_data = $data['data']['raw_data'];

// 先处理PDF生成请求,避免输出HTML后无法发送PDF头
if(isset($_POST['generate_pdf'])){
    require_once('tcpdf/tcpdf.php');
    
    // 修正常量拼写错误
    $tcpdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    $tcpdf->SetCreator('PDF_CREATOR');
    $tcpdf->SetTitle('Property Price Report');
    $tcpdf->SetHeaderData('', '', PDF_HEADER_TITLE, PDF_HEADER_STRING);
    $tcpdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
    $tcpdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
    $tcpdf->SetDefaultMonospacedFont('helvetica');
    $tcpdf->SetFooterMargin(PDF_MARGIN_FOOTER);
    $tcpdf->SetMargins(PDF_MARGIN_LEFT, '5', PDF_MARGIN_RIGHT);
    $tcpdf->setPrintHeader(false);
    $tcpdf->setPrintFooter(false);
    $tcpdf->SetAutoPageBreak(true, 10);
    $tcpdf->SetFont('helvetica', '', 12);
    $tcpdf->AddPage('P', 'A4');
    
    // 动态生成PDF里的表格,复用之前的JSON数据
    $html = '<html><head></head><body>';
    $html .= '<table border="1">';
    $html .= '<tr><th>Price</th><th>Lat</th><th>Lng</th><th>Bedrooms</th><th>Type</th><th>Distance</th></tr>';
    foreach($raw_data as $raw){
        $html .= "<tr>
            <td>{$raw['price']}</td>
            <td>{$raw['lat']}</td>
            <td>{$raw['lng']}</td>
            <td>{$raw['bedrooms']}</td>
            <td>{$raw['type']}</td>
            <td>{$raw['distance']}</td>
        </tr>";
    }
    $html .= '</table></body></html>';
    
    $tcpdf->writeHTML($html, true, 0, true, 0);
    $tcpdf->lastPage();
    $tcpdf->Output("datareport.pdf", 'I');
    exit; // 生成PDF后终止脚本,避免继续输出HTML
}
?>
<!DOCTYPE html>
<html>
<body>
    <table border="1">
        <thead>
            <tr>
                <td>Price</td>
                <td>Lat</td>
                <td>Lng</td>
                <td>Bedrooms</td>
                <td>Type</td>
                <td>Distance</td>
            </tr>
        </thead>
        <tbody>
            <?php foreach($raw_data as $raw){ 
                echo "<tr>
                    <td>{$raw['price']}</td>
                    <td>{$raw['lat']}</td>
                    <td>{$raw['lng']}</td>
                    <td>{$raw['bedrooms']}</td>
                    <td>{$raw['type']}</td>
                    <td>{$raw['distance']}</td>
                </tr>"; 
            } ?>
        </tbody>
    </table>
    <form method="POST">
        <input type="submit" name="generate_pdf" value="Generate PDF">
    </form>
</body>
</html>

重点修复说明:

  1. 调整代码执行顺序:把PDF生成的逻辑放在最前面,这样当用户提交表单时,服务器还没输出任何HTML内容,TCPDF可以正常发送PDF的HTTP头,避免"headers already sent"错误。
  2. 修正TCPDF常量拼写:把PDG_PAGE_ORIENTATION改成正确的PDF_PAGE_ORIENTATION。
  3. 动态生成PDF表格:复用解析后的JSON数据生成PDF里的表格,避免硬编码数据,同时保证HTML标签完全闭合。
  4. 添加exit语句:生成PDF后立即终止脚本,防止后续的HTML内容被输出到PDF文件里。

这样修改后,点击"Generate PDF"按钮应该就能正常生成包含完整表格的PDF文件了。

内容的提问来源于stack exchange,提问作者janus sumbilon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:22:51