【问题标题】:Wkhtmltopdf doesn't print images with subdomainWkhtmltopdf 不打印带有子域的图像
【发布时间】:2014-12-19 21:21:01
【问题描述】:

我在 Symfony2 应用程序中使用 Wkhtmltopdf 将一些文件转换为 PDF。事实上,KnpSnappyBundle 确实如此。这个捆绑包很好用,但我有一个奇怪的问题:

Web 应用程序有两个子域:test.domainprod.domain。此时两个子域的内容完全相同。 由于某种原因,使用prod 子域时不会打印图像(转换为 PDF)。但是,如果我直接访问 URL,则图像存在。一个例子是:

<img src="prod.domain/img/theImage.jpg" /> <!-- This doesn't print the image but the URL is accessible -->
<img src="test.domain/img/theImage.jpg" /> <!-- This works right -->

我终于决定暂时使用test 子域图片网址,但这很奇怪……有什么想法吗?

编辑:

我忘了说prod 域使用 SSL,而test 没有。这似乎是主要问题。

我已经从服务器执行了:

 wkhtmltopdf https://prod.domain test.pdf

Loading pages (1/5)
QSslSocket: cannot resolve SSLv2_client_method               ] 10%
QSslSocket: cannot resolve SSLv2_server_method
Error: Failed loading page https://prod.domain (sometimes it will work just to ignore this error with --ignore-load-errors)

所以我又试了一次:

wkhtmltopdf --ignore-load-errors https://prod.domain test.pdf

Loading pages (1/5)
QSslSocket: cannot resolve SSLv2_client_method               ] 10%
QSslSocket: cannot resolve SSLv2_server_method
Warning: Failed loading page https://prod.domain (ignored)  
Resolving links (2/5)
Counting pages (3/5)                                                      
Printing pages (5/5)                                                      
Done               

但新文件是银行。

如果我使用test 域(无 SSL):

 wkhtmltopdf http://test.domain test.pdf

Loading pages (1/5)
QSslSocket: cannot resolve SSLv2_client_method               ] 21%
QSslSocket: cannot resolve SSLv2_server_method
Resolving links (2/5)                                              
Counting pages (3/5)                                                      
Printing pages (5/5)                                                      
Done                      

我遇到了前两个错误,但它可以正常工作并且文件是正确的。

【问题讨论】:

    标签: symfony subdomain wkhtmltopdf


    【解决方案1】:

    我曾经遇到过类似的问题。

    您必须始终记住 wkhtmltopdf 在服务器上运行。

    这意味着:

    • 与您的开发机器不同的 ip(prod.domain 上的 IP 限制?)
    • 没有会话开始(只有登录的用户才能看到文件?)
    • 不知道您的 hosts 文件(也许您在 hosts 文件中定义了 prod.domain?)

    在运行wkhtmltopdf的服务器上登录时尝试wget prod.domain/img/theImage.jpg

    【讨论】:

    • 由于 SSL 协议,我可以使用 wget --no-check-certificate prod.domain/img/theImage.jpg 做到这一点。认为该文件是可访问的。这样做的错误是 图像 没有显示。
    • @Manolo " --no-check-certificate " 检查证书时是否有效?我认为服务器不会接受证书,因此 wkhtmltopdf 看不到它们
    • 不,如果我不使用--no-check-certificate,它就行不通
    • wget 不显示图像,它只是将其下载到您当前的位置。然后,您可以将其转移到可以查看的地方。
    • 是的,如果我使用--no-check-certificate,图像就可以了
    【解决方案2】:

    在黑暗中拍摄...尝试通过动作代理图像。像这样我们首先使用Imagine 加载文件,然后在响应中输出图像内容:

    /**
     * @Route("/someroute/image", name="someroute_image")
     * @Method("get")
     */
    public function imageAction(Request $request)
    {
        $imagine = new Imagine();
        $absoluteUrl = $request->getSchemeAndHttpHost() . $this->get('templating.helper.assets')->getUrl('/images/logo.png');
        $image = $imagine->open($absoluteUrl);
        $response = new Response($image->get('png'));
        $response->headers->set('Content-Type', 'image/png');
        return $response;
    }
    

    链接到您的 img 标签的 src= 属性中的操作,而不是直接链接到图像。

    【讨论】:

      【解决方案3】:

      我想我遇到了同样的问题,这是我的代码(很旧)

      protected function prepareForRender($data) {
      
          $data['app']=array('request' => array('schemeAndHttpHost' => "http://your.host.com"));
          $this->container->enterScope('request');
          $this->container->set('request', new Request(), 'request');
          return $data;
      }  
      
      public function generatePdf(){
      
              $data=array();
              $data=$this->prepareForRender($data);
      
              $html=$this->container->get('templating')->render('someBundle:Report:foo.pdf.html.twig', $data);
              try {
                  $pdfString=$this->knp_snappy->getOutputFromHtml($html, array(
                      'enable-javascript' => true, 
                      'javascript-delay' => 1000, 
                      'no-stop-slow-scripts' => true, 
                      'no-background' => false, 
                      'lowquality' => false,
                      'page-height' =>200,
                      'page-width'  => 300,
                      'encoding' => 'utf-8',
                      'images' => true,
                      'cookie' => array(),
                      'dpi' => 300,
                      'image-dpi' => 300,
                      'enable-external-links' => true,
                      'enable-internal-links' => true
                  ));
              } catch(\Exception $e) {
                  $this->logger->crit($e->getMessage());
              }
      
              return $pdfString;
      }
      

      而且 img src 必须是一个 sbolute url 之类的:

      <img width="405" height="130" src="{{ app.request.schemeAndHttpHost }}/bundles/akdjaskld/Header.png" alt="">
      

      你最好用http://your.host.com 做一个参数,这样每个阶段都有不同的版本,也许你只是缺少images=&gt;true 选项

      【讨论】:

      • 好吧,其实我就是这样做的,但是我直接发布了 HTML,因为我都尝试了。问题似乎与 SSL (https) 有关,prod 域使用的协议。
      • images=&gt;true 选项在配置文件中设置(适用于test 域)。
      • 一些评论说Just install openssl-devel
      • 它不会改变任何东西。
      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 2012-05-03
      • 2015-04-03
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 2013-06-26
      • 2013-07-06
      相关资源
      最近更新 更多