Laravel 5.1 Snappy pdf 图像未在 pdf 文件中呈现
Laravel 5.1 Snappy pdf image not rendering in pdf file
我正在使用 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);
}
问题:
当我使用以下代码从包含第一个文件的 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);
但是当我对第二个文件执行完全相同的操作时,pdf 不会渲染图像。(当我在浏览器中打开 link 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);
谢谢,
K
我想我明白了问题所在,访问图像的路径是通过身份验证,即使用户在访问 snappy 时已登录,wkhtmltopdf exe 在 shell 那是完全不同的会话。现在正确的解决方法是将图像嵌入发送到 snappy 的 html 而不是 link,我不确定我将如何做?欢迎提出任何建议。
更新:
我能够将图像转换为数据: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');
您还可以这样做:
<img src="data:image/jpeg;base64,
{{ base64_encode(@file_get_contents(url('your.image.url'))) }}">
我正在使用 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);
}
问题:
当我使用以下代码从包含第一个文件的 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);
但是当我对第二个文件执行完全相同的操作时,pdf 不会渲染图像。(当我在浏览器中打开 link 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);
谢谢,
K
我想我明白了问题所在,访问图像的路径是通过身份验证,即使用户在访问 snappy 时已登录,wkhtmltopdf exe 在 shell 那是完全不同的会话。现在正确的解决方法是将图像嵌入发送到 snappy 的 html 而不是 link,我不确定我将如何做?欢迎提出任何建议。
更新: 我能够将图像转换为数据: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');
您还可以这样做:
<img src="data:image/jpeg;base64,
{{ base64_encode(@file_get_contents(url('your.image.url'))) }}">