ismaelw / laravel-php-latex
Requires
- php: ^7.4
- illuminate/filesystem: 5.4.x|5.5.X|5.6.X|5.7.X|5.8.X|^6.0|^7.0|^8.0
- illuminate/support: 5.4.x|5.5.X|5.6.X|5.7.X|5.8.X|^6.0|^7.0|^8.0
- symfony/process: ^2.0|^3.0|^4.0|^5.0
This package is auto-updated.
Last update: 2020-12-27 21:23:29 UTC
README
LaTeX是一个卓越的排版系统,使用它可以制作非常专业和干净的文档。文档可以是一篇简单的文章或一本巨大的技术/科学书籍。
选择LaTeX的原因是它内置了丰富的功能,包括标题、页脚、图书索引、页码、水印等...一旦你探索了LaTeX文档的潜力,你会感到惊讶。
此包使用整个脚手架,你可以用它来生成、保存或下载PDF文档。
重要提示
我正在为这个包开发一个全新的版本。请使用另一个版本。您可以在以下位置找到新包:ismaelw\LaraTeX 我将不会继续开发此包。
先决条件
您需要在服务器上安装texlive-full
程序。此程序包含tex包和语言库,有助于您生成文档。
注意:您也可以选择安装较轻量级的textlive
版本,而texlive-full
包含所有包集合。
区别在于:- 当您安装textlive
并希望使用任何附加的tex包时,您需要手动安装它。- texlive-full
包含这些额外包。因此,它可能在服务器上占用一些额外的空间(用于存储包库文件)。
安装
composer require ismaelw/laravel-php-latex
干运行
在直接使用之前,确保服务器上已正确安装所需的程序非常重要。该包包含干运行方法,您可以在任何控制器或路由中使用。如果一切设置正确,它将自动生成dryrun.pdf
。如果不正确,它将抛出带有详细服务器错误的LatexException
。
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Ismaelw\Latex; class TestController extends Controller { /** * Download PDF generated from latex * * @return Illuminate\Http\Response */ public function download(){ return (new Latex)->dryRun(); } }
干运行将下载一个如下所示的美丽干净的测试PDF
使用方法
- 创建包含tex数据的视图文件
在resources/views/latex/tex.blade.php
中创建一个视图文件
\documentclass[a4paper,9pt,landscape]{article} \usepackage{adjustbox} \usepackage[english]{babel} \usepackage[scaled=.92]{helvet} \usepackage{fancyhdr} \usepackage[svgnames,table]{xcolor} \usepackage[a4paper,inner=1.5cm,outer=1.5cm,top=1cm,bottom=1cm,bindingoffset=0cm]{geometry} \usepackage{blindtext} \geometry{textwidth=\paperwidth, textheight=\paperheight, noheadfoot, nomarginpar} \renewcommand{\familydefault}{\sfdefault} \pagestyle{fancy} \fancyhead{} \renewcommand{\headrulewidth}{0pt} \fancyfoot{} \fancyfoot[LE,RO]{\thepage} \fancyfoot[C]{\fontsize{8pt}{8pt}\selectfont Above document is auto-generated.} \renewcommand{\footrulewidth}{0.2pt} \begin{document} \section*{\centering{Test Document}} \begin{center} \item[Name :] {{ $name }} \item[Date of Birth :] {{ $dob }} \end{center} \blindtext \begin{table}[ht] \centering \begin{adjustbox}{center} \renewcommand{\arraystretch}{2} \begin{tabular}{|l|l|} \hline \rowcolor[HTML]{E3E3E3} \textbf{Sr. No} & \textbf{Addresses}\\ \hline @foreach($addresses as $key => $address) \renewcommand{\arraystretch}{1.5} {{ $key }} & {{ $address }} \\ \hline @endforeach \end{tabular} \end{adjustbox} \caption{Address Summmary} \end{table} \blindtext \vfill \centering \end{document}
您可以看到我们如何轻松使用blade指令{{ $name}}或@foreach在表格中显示地址来动态生成内容。对于更复杂的LaTeX文件,您始终可以使用Laravel的@php @endphp
方法或纯PHP如<?php echo $var; ?>
或<?= $var ?>
。
- 生成文件
您可以选择几种操作来生成文件。
- 您可以将文件作为响应下载
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Ismaelw\Latex; class TestController extends Controller { /** * Download PDF generated from LaTex * * @return Illuminate\Http\Response */ public function download(){ return (new Latex('latex.tex'))->with([ 'name' => 'John Doe', 'dob' => '01/01/1994', 'addresses' => [ '20 Pumpkin Hill Drive Satellite Beach, FL 32937', '7408 South San Juan Ave. Beaver Falls, PA 15010' ] ])->download('test.pdf'); } }
- 您可以将PDF保存到您想要的任何位置以供以后使用
(new Latex('latex.tex'))->with([ 'name' => 'John Doe', 'dob' => '01/01/1994', 'addresses' => [ '20 Pumpkin Hill Drive Satellite Beach, FL 32937', '7408 South San Juan Ave. Beaver Falls, PA 15010' ] ])->savePdf(storage_path('exports/pdf/test.pdf'));
每次保存文件时,它都会在您的Laravel存储app/temp
目录中创建它。
- 您可以直接渲染tex而不生成PDF
$tex = new Latex('latex.tex'))->with([ 'name' => 'John Doe', 'dob' => '01/01/1994', 'addresses' => [ '20 Pumpkin Hill Drive Satellite Beach, FL 32937', '7408 South San Juan Ave. Beaver Falls, PA 15010' ] ])->render();
设置自定义二进制路径
如果你的服务器环境中没有在 $PATH
中安装 pdflatex
,你可能需要提供完整的路径来执行命令。要找到路径,你可以这样做
which pdflatex
然后你可以使用如下 binPath
函数传递这个路径
return (new Latex('latex.tex'))->with([ 'name' => 'John Doe', 'dob' => '01/01/1994', 'addresses' => [ '20 Pumpkin Hill Drive Satellite Beach, FL 32937', '7408 South San Juan Ave. Beaver Falls, PA 15010' ] ])->binPath('/usr/bin/pdflatex')->download('test.pdf');
使用原始LaTeX
如果你不想使用视图作为LaTeX文件,但已经有LaTeX内容。或者使用其他库生成LaTeX内容,例如 Markdown-to-LaTeX,你可以使用 RawTex
类而不是传递视图路径
$tex = new RawTex('your_raw_tex_content_string.....'); return (new Latex($tex))->with([ 'name' => 'John Doe', 'dob' => '01/01/1994', 'addresses' => [ '20 Pumpkin Hill Drive Satellite Beach, FL 32937', '7408 South San Juan Ave. Beaver Falls, PA 15010' ] ])->download('test.pdf');
批量下载为zip归档
想要导出多个PDF文件到zip文件中?这个包已经为你准备好了这个功能。这为你提供了很大的灵活性。然而,请确保不要一起传递过多的PDF文件,因为它导出这些文件时将消耗大量服务器内存。
$latexCollection = (new LatexCollection()); $users = User::limit(10)->get(); foreach ($users as $user) { $pdfName = $user->first_name.'-'.$user->last_name.'-'.$user->id.'.pdf'; // Create latex instance $latex = (new Latex('latex.patientsummary'))->with([ 'user' => $user ])->setName($pdfName); // Add it to latex collection $latexCollection->add($latex); } // Download the zip return $latexCollection->downloadZip('bulk.zip'); // OR you can also save it $latexCollection->saveZip(storage_path('exports/zips/users.zip'));
监听事件
每当成功生成PDF时,它将触发一个名为 LatexPdfWasGenerated
的事件。同样,每当PDF生成失败时,它将触发事件 LatexPdfFailed
。
如果你需要根据生成状态执行某些操作,例如更新数据库,这些事件非常重要。但通常这些PDF都有一些元数据,比如PDF属于哪个用户或哪个订单。你可以在以第二个参数的形式实例化 latex
时传递这些元数据。
然后从触发的事件中返回这些元数据,这使得监听更加有意义。元数据可以是任何东西,可以是字符串、数字、数组、对象、集合等。你可以根据你的需求逻辑传递元数据。
// $user will be our metadata in this example $user = Auth::user(); (new Latex('latex.tex', $user))->with([ 'name' => 'John Doe', 'dob' => '01/01/1994', 'addresses' => [ '20 Pumpkin Hill Drive Satellite Beach, FL 32937', '7408 South San Juan Ave. Beaver Falls, PA 15010' ] ])->savePdf(storage_path('exports/pdf/test.pdf'));
然后你可以定义一个监听器,如下所示
<?php namespace App\Listeners; use Ismaelw\LatexPdfWasGenerated; class LatexPdfWasGeneratedConfirmation { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param LatexPdfWasGenerated $event * @return void */ public function handle(LatexPdfWasGenerated $event) { // Path of pdf in case in was saved // OR // Downloaded name of pdf file in case it was downloaded in response directly $pdf = $event->pdf; // download OR savepdf $action = $event->action; // metadata $user in this example $user = $event->metadata; // Perform desired actions } }
垃圾回收
当你导出PDF时,pdflatext
会生成一些额外文件,例如 .aux
、.log
、.out
等。该包会自动处理垃圾回收过程。它会确保在生成PDF或发生任何错误时没有残留文件。
这样可以确保服务器不会浪费空间保留这些残留文件。
错误处理
我们使用来自 texlive
的 pdflatex
程序来生成PDF。如果你的TeX文件中发生语法错误,它将被记录到日志文件中。或者如果它被关闭,它将在控制台显示输出。
该包会内部处理这些,并抛出许多 ViewNotFoundException
。异常将包含关于错误的所有信息,便于您进行调试。
如果您想为此包添加新功能,请随时贡献。
许可
此包是开源软件,受MIT许可证的许可