【问题标题】:wkhtmltopdf failing to convert local pages to PDFwkhtmltopdf 无法将本地页面转换为 PDF
【发布时间】:2012-05-17 04:31:00
【问题描述】:

我一直在尝试让 wkhtmltopdf 转换网站上的页面,但它无法转换相同的页面。它将转换和存储外部页面(用 google 和 bbc.co.uk 尝试过,两者都有效)所以权限很好但是如果我尝试转换本地页面,无论是静态 html 文件还是由脚本生成的,失败前大约需要 3 分钟。

输出显示页面加载失败,如果强行忽略这个,我会得到一个空白的PDF。

我认为这可能是会话锁定,但关闭会话会导致同样的问题。我觉得这取决于服务器的行为方式

这是有问题的代码:

            session_write_close ();
    set_time_limit (0);
            ini_set('memory_limit', '1024M');
    Yii::app()->setTheme("frontend");

    // Grabbing the page name
    $ls_url = Yii::app()->request->getHostInfo().Yii::app()->request->url;

    // Let's remove the PDF otherwise we'll be in endless loop
    $ls_url = str_replace('.pdf','',$ls_url);

    // Setting paths
    $ls_basePath = Yii::app()->basePath."/../extras/wkhtmltopdf/";
    if(PHP_OS=="Darwin")
        $ls_binary = $ls_basePath . "wkhtmltopdf-osx";
    else 
        $ls_binary = $ls_basePath . "wkhtmltopdf";

    $ls_generatedPagesPath = $ls_basePath . "generated-pages/";
    $ls_outputFileName = str_replace(array("/",":"),"-",$ls_url)."--".date("dmY-His").".pdf";
    $ls_outputFile = $ls_generatedPagesPath. $ls_outputFileName;

    // making sure no nasty chars are in place
    $ls_command = escapeshellcmd($ls_binary ." --load-error-handling ignore " . $ls_url . " " . $ls_outputFile);


    // Let's run things now
    system($ls_command);

【问题讨论】:

  • 调试 wkhtmltopdf 时,我的第一步是在 shell_exec() 中硬编码命令。如果可行,您就知道这不是 wkhtmltopdf 问题。在处理其他任何事情之前,我会让那一行代码与本地副本一起工作。
  • 但如果我尝试转换本地页面......失败前大约需要 3 分钟 - 如果你也从命令行运行它是这种情况吗?

标签: php pdf wkhtmltopdf


【解决方案1】:

你lynx那个确切的网址吗?由于 wkhtmltopdf 实际上是一个小巧但功能强大的 webkit 浏览器,它就像普通浏览器一样失败。

检查您提供的 URL,检查您页面中的外部 URL 是否可以从您的服务器访问。它会在开始制作 PDF 之前加载 CSS、外部图像、iframe 以及所有内容。

就个人而言,我喜欢 wkhtmltpdf。没有什么能比得上它。

【讨论】:

  • 刚刚用 Lynx 测试过。完全一样的症状,本地地址需要30秒没有输出(估计是失败了),google很快返回输出。看起来它与服务器配置有关。有什么想法可能导致它吗?我的主机是否在执行诸如将 apache 锁定到单个进程之类的操作?
  • 表示它不是 wkhtmltpdf。您在 URL 中使用 localhost 吗?尝试从您的服务器中 ping 您的 URL 的域名。如果您不能,则表示您的域名解析为您的 IP,该 IP 由您的防火墙 + NAT 获取,因此您永远无法从外部 IP 连接到自己。
  • 它是通过 Yii 生成的 url 来做的,在这种情况下是一个 IP 地址(域名目前不活跃)。 ping 也失败了,所以它看起来很可能被防火墙了。我以为我已经尝试允许全部通过端口 80,但看起来有一些我无法访问的额外措施。看来我可能得给我的房东打电话了。
  • 总有一个localhost/youpath/yourfile.php 可用于获取您的网站。如果你的 apache 虚拟主机没有 ServerName 那么它就可以正常工作。
  • 设法让它最终排序。主机将内部 IP 指向正确的站点根目录,从而阻止它被防火墙,并且不需要太多的重新编码来实现。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 2017-12-24
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多