sircoolmind/laravel-pdf-latex-new

为 Laravel 生成 PDF 的 Latex 包。归功于原作者和负责最新功能的技术人员

1.3 2024-08-20 01:36 UTC

This package is auto-updated.

Last update: 2024-09-19 07:10:48 UTC


README

Laravel    LaTex

LaTex 是一个非凡的排版系统,使用它你可以创建非常专业和干净的文档。文档可以是简单的文章或巨大的技术/科学书籍。

选择 LaTex 的原因是它内置了广泛的功能,包括页眉、页脚、书索引、页码、水印等...一旦你探索了 LaTex 文档的可能性,你将会感到惊讶。

此包使用整个框架,你可以用它来生成、保存或下载 PDF 文档。

先决条件

您需要在您的服务器上安装 texlive-full 程序。此程序包含 tex 包和语言库,可以帮助您生成文档。

注意:您也可以选择安装较轻量级的 textlive,这是该包的简化版本,而 texlive-full 包含所有包捆绑。

区别是:- 当您安装 textlive 并想使用任何额外的 tex 包时,您需要手动安装它。- texlive-full 内置了这些额外包。因此,它可能在服务器上占用一些额外的空间(用于存储包库文件)。

1. 在服务器/vagrant 内设置 Latex 依赖项

sudo apt install texlive-full

2. 设置 Latex 包管理器

tlmgr init-usertree
tlmgr option repository ctan

tlmgr repository add ftp://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2019/tlnet-final
tlmgr repository list
tlmgr repository remove http://mirror.ctan.org/systems/texlive/tlnet
tlmgr option repository ftp://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2019/tlnet-final

tlmgr --verify-repo=none install dirtree
tlmgr --verify-repo=none install fontsize

如果遇到错误“tlnet-final not found”,可能是您的操作系统版本已更新。您可以尝试将 URL 中的年份更新为 2021。

tlmgr repository add ftp://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2021/tlnet-final
tlmgr repository list
tlmgr repository remove http://mirror.ctan.org/systems/texlive/tlnet
tlmgr option repository ftp://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2021/tlnet-final

以下命令适用于 IMT Tech Sdn Bhd 员工和 Laravel 5

需要两个独立文件,IMTTechReports.cls 和 logo.png。可以向 Hafiz 或 Kak Ija 询问。

返回 Texlive 路径值

kpsewhich -var-value TEXMFHOME

将 %path% 替换为上面的值

sudo mkdir %path%/tex/latex/imttech
sudo cp IMTTechReports.cls %path%/tex/latex/imttech/
sudo mkdir %path%/tex/latex/imttech/images
sudo cp th_logo.png %path%/tex/latex/imttech/images

原文

sudo mkdir /vagrant/home/texmf/tex/latex/imttech
sudo cp IMTTechReports.cls /home/vagrant/texmf/tex/latex/imttech/
sudo mkdir /vagrant/home/texmf/tex/latex/imttech/images
sudo cp th_logo.png /home/vagrant/texmf/tex/latex/imttech/images

安装

composer require sircoolmind/laravel-pdf-latex-new

干运行

在直接使用之前,确保在您的服务器上正确安装了所需的程序非常重要。该包包含 dryrun 方法,您可以在任何控制器或路由中调用它。如果一切设置正确,它将自动生成 dryrun.pdf。如果不正确,它将抛出带有详细服务器错误的 LatexException

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use SirCoolMind\PDFConverter\Latex;

class TestController extends Controller
{
    /**
     * Download PDF generated from latex
     * 
     * @return Illuminate\Http\Response
     */
    public function download(){

        return (new Latex)->dryRun();
    }
}

干运行将下载一个像下面的漂亮干净的测试 PDF

dryrun.pdf sample

用法

  • 创建包含 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)在表格中显示地址,以动态生成内容。

  • 生成文件

您可以选择以下几种操作来生成文件。

  1. 您可以将文件作为响应下载
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use SirCoolMind\PDFConverter\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');
    }
}
  1. 您可以将 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'));
  1. 您可以直接渲染 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();

设置自定义 bin 路径

如果您的服务器环境中没有 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');

使用原始 Tex

如果您不想使用视图作为 tex 文件,但已经有了 tex 内容。或者使用其他库来生成 tex 内容,例如 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 SirCoolMind\PDFConverter\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 等。该软件包会自动处理垃圾回收过程,确保在生成 PDF 或发生任何错误时没有残留文件。

这确保服务器不会浪费空间保留残留文件。

错误处理

我们使用 texlive 中的 pdflatex 程序来生成 PDF。如果您的 tex 文件中发生语法错误,它会记录到日志文件中。或者关闭输出,则会在控制台显示输出。

该软件包会内部处理这些,并抛出许多 ViewNotFoundException。异常将包含有关错误的全部信息,方便您进行调试。

如果您想为该软件包添加新功能,请随时贡献。

许可证

此软件包是开源软件,许可协议为 MIT 许可证