Laravel 5.1 Snappy pdf图像未在pdf文件中呈现

kar*_*dra 1 pdf-generation wkhtmltopdf laravel

我正在使用barryvdh / laravel-snappy生成pdf文件。我有两个图像文件1. yourlogohere.png在public / image /文件夹中,并且2. logo2.png在public以外的文件夹中,即storage / app / logo,要获取此文件,我定义了一条路线(www.example.org /logo/logo.png),然后使用以下代码进行访问。

public function logo($filename)
{
    $file = Storage::disk('local_logo')->get($filename);
    $mime = 'image/png';
    return (new Response($file, 200))->header('Content-Type', $mime);
}
Run Code Online (Sandbox Code Playgroud)

问题:

当我使用以下代码从包含第一个文件的html生成pdf时,pdf包含yourlogohere.png图像

$snappy = App::make('snappy.pdf');
$html='<img src="http://www.example.org/images/yourlogohere.png" class="img-responsive" alt="Your Logo Here">';
$snappy->generateFromHtml($html, $path,[],$overwrite = true);
Run Code Online (Sandbox Code Playgroud)

您的徽标图片以pdf格式显示

但是当我对第二个文件执行完全相同的操作时,pdf不会渲染图像(当我http://www.example.org/logo/logo2.png在浏览器中打开链接时,会得到图像)。我想念什么?

$snappy = App::make('snappy.pdf');
$html='<img src="http://www.example.org/logo/logo2.png" class="img-responsive" alt="Your Logo Here">';
$snappy->generateFromHtml($html, $path,[],$overwrite = true);
Run Code Online (Sandbox Code Playgroud)

不渲染图像,仅出现一个矩形

谢谢,

ķ

Mar*_*ciu 6

您也可以:

<img src="data:image/jpeg;base64,
{{ base64_encode(@file_get_contents(url('your.image.url'))) }}">
Run Code Online (Sandbox Code Playgroud)


kar*_*dra 5

我想我明白了问题所在,访问图像的路由是通过身份验证的,即使用户在访问 snappy 时登录,wkhtmltopdf exe 也会在完全不同的会话的 shell 中运行。现在正确的解决方法是将图像嵌入发送到 snappy 而不是链接的 html 中,我不确定我将如何做?欢迎任何建议。

更新: 我能够将图像转换为 data:image/png;base64,并将其嵌入到 html 中。

$html = view('mytemplate.default', compact('variable1', 'variable2'))->render();

/*Convert logo image to base64 before pdf conversion*/

//search for <img src="http://example.org/mytemplate/logo/logo1.png">" and replace the src with data:image/png;base64,
$search = '/(<img\s+src=["\'])([^"\']+)(\/mytemplate\/logo\/)(.*)(\.)(.*?)(["\']\s+[^>]+>)/'; 

$html = preg_replace_callback($search, function ($matches) use ($invoicedetail) {

    $filename = $matches[4] . $matches[5] . $matches[6];
    $file = Storage::disk('local_logo')->get('yourlogohere.png');
    $mime = "image/png";
    $mytemplate = MyTemplate::where('logo_filename', '=', $filename)->first();
    if (!empty($mytemplate)) {
        $file = Storage::disk('local_logo')->get($mytemplate->logo_filename);
        $mime = $mytemplate->logo_mime;
    }
    $base64 = 'data:' . $mime . ';base64,' . base64_encode($file);
    return $matches[1] . $base64 . $matches[7];
}, $html);

$pdf_filename = 'template' . $mytemlpate->id . '.pdf';
$path = storage_path('app' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . $filename);
$snappy = App::make('snappy.pdf');
Run Code Online (Sandbox Code Playgroud)