2014-12-03 48 views
3

我正在使用Wkhtmltopdf將某些文件轉換爲PDF在Symfony2應用程序。其實KnpSnappyBundle呢。這個捆綁包效果很好,但我有一個奇怪的問題:Wkhtmltopdf不打印圖像的子域

該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子域圖像的URL,但它的怪異......你知道嗎?

編輯:

我忘了說,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      

我得到了前兩個錯誤,但它的工作原理和文件是正確的。

回答

3

我曾經有過類似的問題。

你總是要記住wkhtmltopdf在服務器上運行。

這意味着:

  • 不同的IP比你的dev的機器(上prod.domain IP限制?)
  • 沒有會話啓動(只有登錄的用戶可以看到該文件?)
  • 隱而不宣」知道你的hosts文件(在你的主機也許你已經定義prod.domain文件?)

嘗試wget的prod.domain/img/theImage.jpg對SERV登錄時呃跑步wkhtmltopdf

+1

由於採用SSL協議,我可以使用'wget --no-check-certificate prod.domain/img/theImage.jpg'來做到這一點。認爲該文件是可訪問的。這是錯誤的**圖像**不顯示。 – Manolo 2014-12-12 10:07:51

+0

@Manolo「' - no-check-certificate'」檢查證書時工作嗎?我認爲服務器不會接受證書,因此wkhtmltopdf無法看到他們 – Waaghals 2014-12-12 14:05:32

+0

我已更新我的問題。你可以在那裏看到它。 – Manolo 2014-12-12 14:06:41

1

我想我有同樣的問題,我的繼承人的代碼(很老)

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=>true選項

+0

嗯,其實這就是我所做的,但我直接發佈了HTML,因爲我都嘗試過。這個問題似乎與SSL(https)相關,這是由'prod'域使用的協議。 – Manolo 2014-12-12 18:52:59

+0

'images => true'選項在配置文件中設置(並在'test'域中工作)。 – Manolo 2014-12-12 18:54:19

+0

這可能有助於http://oapeon.blogspot.de/2010/06/enabling-support-for-https-in.html – 2014-12-12 19:21:02

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

鏈接在src=屬性的img標籤,而不是直接在圖像的動作。