使用 html 元素创建 pdf 文件以在 php 和 codeigniter 中生成发票的可能选项

possible options to create pdf file using html elements to generate invoice in php and codeigniter

大家好,这可能是 Whosebug 上最常见的问题, 我在 html 中有一个像这样 demo page 的发票模板。我想生成一个发票 pdf 文件,当用户点击按钮时。

任何人都可以建议我执行此任务的最佳选择吗? 我已经尝试过 jsPDF 和 html2canvas,但它没有按预期工作。 所以如果有更好的方法,请告诉我。

谢谢。

如果您只想像浏览器一样呈现页面,您可以尝试 Puppeteer, a way to control a headless browser instance of Chrome or any solution based on WKHTMLPDF (like Snappy)。它实际上是(自述文件中的示例):

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});
  await page.pdf({path: 'hn.pdf', format: 'A4'});

  await browser.close();
})();

当然,如果页面不是 public,它会变得更诡异,但您可以通过一些技巧来解决这个问题。

如果您真正想要的只是按原样打印页面,您可以尝试 media query for print。这通常是打印页面的最佳方式。

不过,如果你真的想打印一张看起来不错的发票,你应该在服务器端打印,而不是在客户端打印。试图生成一张看起来像 html 的发票似乎只是一个借口,以避免必须以“正确”的方式进行手动创建 pdf 的工作;)

我建议使用 tcpdf,这对我来说效果很好,下面是我使用它的示例:

    $query = "SELECT * FROM login WHERE type_login='customer'";
    $result=mysqli_query($connect, $query);
    while($row = mysqli_fetch_array($result))
    {
        $output .='
            <tr>
                <td>'.$row["id_login"].'</td>
                <td>'.$row["name_login"].'</td>
                <td>'.$row["user_email"].'</td>
            </tr>
        ';
    }

    return $output;
}

if(isset($_POST["create_pdf"]))
{
    require_once("tcpdf/tcpdf.php");
    $obj_pdf = new TCPDF('P',PDF_UNIT,PDF_PAGE_FORMAT,true,"UTF-8",false);
    $obj_pdf->SetCreator(PDF_CREATOR);
    $obj_pdf->SetTitle("Customer List");
    $obj_pdf->SetHeaderData("","", PDF_HEADER_TITLE, PDF_HEADER_STRING);
    $obj_pdf->SetHeaderFont(Array(PDF_FONT_NAME_MAIN,"",PDF_FONT_SIZE_MAIN));
    $obj_pdf->SetFooterFont(Array(PDF_FONT_NAME_DATA,"",PDF_FONT_SIZE_DATA));
    $obj_pdf->SetDefaultMonospacedFont('helvetica');
    $obj_pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
    $obj_pdf->SetMargins(PDF_MARGIN_LEFT,'5',PDF_MARGIN_RIGHT);
    $obj_pdf->SetPrintHeader(false);
    $obj_pdf->SetPrintFooter(false);
    $obj_pdf->SetAutoPageBreak(TRUE,10);
    $obj_pdf->SetFont('helvetica',"",12);
    $obj_pdf->AddPage();

    $content="";
    $content.='
        <h3 align="center"> Customer List </h3>
        <table border="1" cellspacing="0" cellpadding="5">
            <tr>
                <th width=5%>customer ID</th>
                <th width=10%>Customer Full name</th>
                <th width=15%>Customer Email</th>
            </tr>
    ';

    $content .= fetch_data();
    $content .= '</table>';
    $obj_pdf->writeHTML($content);
    $obj_pdf->Output("sample.pdf","I");



}
?>

<html>
    <head>
        <title>Customer List</title>
        <link rel="stylesheet" type="text/css" href="css/style.css" />
    </head>
    <body>
        <br><br />
        <div class="container" style="width:700px;">
            <h3 align="center"> Customer List </h3>
            <br />
            <div class="table-responsive">
                <table class="table table-bordered" border="1" cellpadding="4">
                    <tr>
                        <td width="5%"><strong>customer ID</strong></td>
                        <td width="10%"><strong>Customer Full name</strong></td>
                        <td width="15%"><strong>Customer Email</strong></td>
                    </tr>
                    <?php
                    echo fetch_data();
                    ?>
                </table>

或者如果你不想使用 tcpdf 的替代方法:

    if (isset($_POST['txtNameSearch'])){
    $search = $_POST['txtNameSearch'];
$connection = mysqli_connect('localhost', 'root', '', 'bookstore');
    $query = "SELECT * FROM tblproduct right join order_details on tblproduct.prod_id=order_details.prod_id WHERE prod_no = $search ";
    $result=mysqli_query($connection, $query);
    while($row = mysqli_fetch_array($result))
    {
        $output .='
            <tr>
                <td>'.$row["prod_id"].'</td>
                <td>'.$row["prod_name"].'</td>
                <td>'.$row["order_id"].'</td>
                <td>'.$row["quantity"].'</td>
            </tr>
        ';
    }

    return $output;
}
}
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>HTML to PDF</title>
</head>
<body>
            <form method="POST" action="index.php">
            <input type="text" name="txtNameSearch" />
            <input class="src_btn" type="submit" name="btnSearch" value="Search" />
            </form>
    <!-- 
    content of this area will be the content of your PDF file 
    -->
    <div id="HTMLtoPDF">

                <table class="table table-bordered" border="1" cellpadding="4">
                <tr>
                        <td width="25%"><strong>prod_id</strong></td>
                        <td width="25%"><strong>prod_name</strong></td>
                        <td width="25%"><strong>order_id</strong></td>
                        <td width="25%"><strong>quantity</strong></td>
</tr>

    <?php       
    echo fetch_data();

    ?>  

    </div>

    <!-- here we call the function that makes PDF -->
    <a href="#" onclick="HTMLtoPDF()">Download PDF</a>
            <a href="/DEVProject/admin/admin_addnew_user.php"> Back to Admin Panel </a>

如果您需要,我也可以准备下载 link 完整的工作代码