Возможные варианты создания PDF-файла с использованием HTML-элементов для генерации счета в php и codeigniter - PullRequest
0 голосов
/ 28 мая 2018

Привет Всем, это может быть самый распространенный вопрос, задаваемый в stackoverflow, у меня есть шаблон счета в формате html, подобный этому демонстрационная страница .Я хочу создать PDF-файл счета-фактуры, когда пользователь нажимает кнопку.

Может кто-нибудь предложить мне лучший вариант для выполнения этой задачи?Я пробовал jsPDF и html2canvas, но он не работает, как ожидалось.поэтому, если есть лучший способ сделать это, пожалуйста, дайте мне знать.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я бы предложил использовать 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>

Если хотите, я могу также подготовить ссылку для загрузки полностью рабочего кода

0 голосов
/ 28 мая 2018

Если вы просто хотите отобразить страницу как браузер, вы можете попробовать Puppeteer , способ управления безголовым экземпляром браузера Chrome.Это было бы буквально (пример из README):

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();
})();

Конечно, если страница не является общедоступной, она становится хитрее, но вы можете обойти это с некоторыми взломами.

Если вам действительно нужно просто напечатать страницу как есть, попробуйте медиазапрос для печати .Обычно это лучший способ напечатать страницу.

Тем не менее, если вы действительно хотите распечатать накладную, которая выглядит красиво, вы должны делать это на стороне сервера, а не на клиенте.Попытка сгенерировать счет-фактуру, похожий на HTML, кажется оправданием, чтобы избежать ручной работы по созданию «правильного» pdf-файла;)

...