【问题标题】:wkhtmltopdf converting the current state of html page to pdf?wkhtmltopdf 将html页面的当前状态转换为pdf?
【发布时间】:2014-03-10 18:33:03
【问题描述】:

HTML 到 pdf 正在通过 php 在本地服务器上发生,并且提供 html 文件作为 pdf 供下载工作正常,我传递给 wkhtmltopdf 的 html 页面充满了用户输入,然后我需要转换 将其转换为 pdf,但它会将我放置在我的 Web 服务器目录中的空白 form_1.html 转换为。

如何获取名为 form_1.htm 的当前打开的 html 页面的 pdf。

我需要在这里使用什么 HTTP_REFERER。

<?php
//Passing form_1.htm page prints the black form html page I want to print it after it opens in browser with filled user's input.
$result = shell_exec('"C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe" form_1.htm vish.pdf 2>> err3.txt 1>> out3.txt');
echo $result;
$file = "vish.pdf";
$pdf = file_get_contents("vish.pdf");

header('Content-Type: application/pdf');
header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Content-Length: '.strlen($pdf));
header('Content-Disposition: inline; filename="'.basename($file).'";');
ob_clean(); 
flush(); 
echo $pdf;
?>
<html>
<head>
</head>
<body>
<p>Karna' wife!</p>
</body>
</html>

【问题讨论】:

    标签: php html pdf wkhtmltopdf


    【解决方案1】:

    您将无法通过打印的方式捕获用户在表单中输入的信息。

    要生成它的 PDF,您需要将数据保存到服务器,然后让 wkhtmltopdf 请求一个页面,该页面的表单中填写了表单中的详细信息。

    这是因为用于服务 HTML 页面的 HTTP 的无状态特性。

    当用户请求 form_1.html 时,他们会收到 HTML 页面,他们会填写表单详细信息,但所有这些信息都存储在本地计算机上。

    如果其他人请求 form_1.html,他们会收到 HTML 页面的另一个副本,但没有任何详细信息,因为 Web 服务器还不知道第一个用户输入的详细信息。

    当用户向服务器提交表单时,服务器只查找第一个用户表单的内容。然后服务器应用程序可以决定如何处理它。

    如果您认为 wkhtmltopdf 与其他使用网络浏览器的用户一样工作,您就会明白为什么他们只收到表单。

    如果你想走 wkhtmlpdf 路线,那么你需要

    1. 在服务器本地保存提交的数据
    2. 设置第二个 HTML 页面,该页面可以被请求并能够加载该特定日期
    3. 设置 wkhtmltopdf 以请求该网页
    4. 将生成的文件发送给用户

    如果您想向用户发送他们输入表单的 PDF 版本而不保存它,更好的方法可能是使用 PHP 处理提交的表单数据并使用服务器端 PDF 生成工具,例如 @987654321 @ 或 http://www.fpdf.org/ ,创建 PDF 并将其发送给用户。它看起来不像他们的形式,但它会为他们生成一个 PDF。

    编辑:有关通过 wkhtmltopdf 执行此操作的方法的更多详细信息(请注意,这不是很安全)

    给定这个 html 表单 (form_1.html)

    <html>
    <body>
    <form method="post" action="respond.php">
       <input type="text" name="fieldname">
       <input type="submit">
    </form>
    

    在您响应表单帖子的 php 中,我们将其称为“respond.php”

    <?php 
    
    $form_values = $_POST;
    
    // you should really validate $form_values
    $contents = serialize($form_values);
    $filename = sha1($contents);
    file_put_contents($filename,$contents);
    
    $result = shell_exec('"C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe" http://localhost/get.php?filename='+$filename+' vish.pdf 2>> err3.txt 1>> out3.txt');
    echo $result;
    $file = "vish.pdf";
    $pdf = file_get_contents("vish.pdf");
    
    header('Content-Type: application/pdf');
    header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
    header('Pragma: public');
    header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
    header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
    header('Content-Length: '.strlen($pdf));
    header('Content-Disposition: inline; filename="'.basename($file).'";');
    ob_clean(); 
    flush(); 
    echo $pdf;
    exit()
    

    在 get.php 中(需要通过网络服务器访问)

    <?php
    
    $filename = $_GET['filename']
    
    // you should really validate $filename
    
    $contents = file_get_contents($filename);
    $form_values = unserialize($contents);
    
    ?>
    <html>
    <body>
    <form>
    <input type="text" name="fieldname" value="<?php print $form_values['fieldname'] ;?>">
    </form>
    </body>
    </html>
    

    关键是您需要让 wkhtmltopdf 接收一个 HTML 页面,该页面具有由服务器填写的表单字段。因此,当 wkh​​tmltopdf 请求 http://localhost/get.php?filename='+$filename+'它时,它会从您的本地主机接收 HTML 页面,其中填写了所有表单详细信息。

    请注意,这是一个概念性解决方案,用于说明您如何使用它。我不会在生产中推荐这个,因为它依赖于默默无闻的安全性

    【讨论】:

    • 使用 tcpdf 和 fpdf 我需要编写大量代码才能完成工作,我正在寻找 wkhtmltopdf 示例。
    • 您必须编写大量代码才能使其与 wkhtmltopdf 一起使用,因为您需要将数据本地存储到服务器然后获取 wkhtmltopdf 以加载它。
    • 与 tcpdf 和 fpdf 相比,我需要编写代码来生成复杂的 html 到 pdf 文件。
    【解决方案2】:

    您必须先传递所有表单参数并重新生成表单,然后再将其传递给 wkhtmltopdf,就像 DorianFM 所描述的 (+1)。

    另一种选择可能是使用服务,为您执行此操作,例如 http://www.pdfmyform.com

    【讨论】:

      猜你喜欢
      • 2019-08-04
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多