主页/PHP笔记/PHP问答/框架Laravel/如何在 Laravel 中返回 PDF 文件

如何在 Laravel 中返回 PDF 文件

Bug编译狮

Bug编译狮

在 Laravel 中生成和返回 PDF 文件通常涉及使用一些库来处理 PDF 创建过程。以下是一个基本的步骤指南,包括使用 dompdf 库来创建 PDF 文件。

1. 安装 DomPDF

首先,你需要安装 dompdf 库。你可以通过 Composer 来完成这个任务:

composer require barryvdh/laravel-dompdf

2. 配置 DomPDF

安装完成后,你需要配置 DomPDF。在 config/app.php 文件中找到 providers 数组,并添加 BarryvdhDomPDFServiceProvider::class

'providers' => [
    // 其他服务提供者...

    BarryvdhDomPDFServiceProvider::class,
],

接下来,在 config/dompdf.php 文件中进行配置,例如设置路径等:

'dompdf' => [
    'path' => storage_path('app/public/pdf'),
],

3. 创建 PDF 文件

现在,你可以创建一个控制器方法来生成 PDF 文件。以下是一个示例:

use BarryvdhDomPDFFacade as PDF;

public function generatePdf()
{
    $data = [
        'title' => 'Sample PDF',
        'content' => 'This is a sample content for the PDF.',
    ];

    $html = view('pdf.template', $data)->render();

    return PDF::load($html, 'letter')->download('sample.pdf');
}

在这个示例中,我们使用了 Blade 模板引擎来渲染 HTML 内容,并将其加载到 dompdf 中生成 PDF 文件。

4. 创建模板文件

resources/views 目录下创建一个名为 pdf/template.blade.php 的文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ $title }}</title>
</head>
<body>
    <h1>{{ $title }}</h1>
    <p>{{ $content }}</p>
</body>
</html>

5. 路由配置

最后,确保你在路由文件中定义了一个路由来访问这个控制器方法:

Route::get('/generate-pdf', [YourController::class, 'generatePdf']);

示例代码

完整的示例代码如下:

// routes/web.php
use AppHttpControllersYourController;
use IlluminateSupportFacadesRoute;

Route::get('/generate-pdf', [YourController::class, 'generatePdf']);

// app/Http/Controllers/YourController.php
namespace AppHttpControllers;

use BarryvdhDomPDFFacade as PDF;
use IlluminateHttpRequest;

class YourController extends Controller
{
    public function generatePdf()
    {
        $data = [
            'title' => 'Sample PDF',
            'content' => 'This is a sample content for the PDF.',
        ];

        $html = view('pdf.template', $data)->render();

        return PDF::load($html, 'letter')->download('sample.pdf');
    }
}

// resources/views/pdf/template.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ $title }}</title>
</head>
<body>
    <h1>{{ $title }}</h1>
    <p>{{ $content }}</p>
</body>
</html>

这样,当你访问 /generate-pdf 路由时,Laravel 将会生成并下载一个名为 sample.pdf 的 PDF 文件。

黑板Bug讲师

黑板Bug讲师

介绍

在Web应用程序中生成和返回PDF文件是一种常见的需求。Laravel作为强大的PHP框架,提供了无缝创建和交付PDF的方法。在这篇教程中,我们将详细介绍在Laravel应用程序中生成和返回PDF文件的不同方法,包括代码示例和解释。

设置环境

在开始生成PDF之前,请确保您已经有一个Laravel项目运行起来。您还需要安装一个允许您处理PDF的包;一个流行的选择是barryvdh/laravel-dompdf为了安装它,请运行以下命令:

composer require barryvdh/laravel-dompdf

安装后,请注册提供商。config/app.php

'providers' => [
    // ...
    BarryvdhDomPDFServiceProvider::class,
],
'aliases' => [
    // ...
    'PDF' => BarryvdhDomPDFFacade::class,
],

基本PDF生成

让我们先生成一个简单的PDF。你可以像这样创建一个路由和对应的控制器方法:

Route::get('/pdf', '[email protected]');

在你的控制器中:

use PDF;

class PdfController extends Controller
{
    public function show()
    {
        $pdf = PDF::loadView('pdfs.simple');
        return $pdf->download('simple.pdf');
    }
}

创建一个视图文件。resources/views/pdfs/simple.blade.php包含HTML的内容,将会被转换为PDF格式:

<h1>Hello, World!</h1>

高级PDF自定义

在实际应用中,您可能希望自定义PDF以包含动态数据、表头、页脚或甚至CSS样式。让我们探讨如何实现这一点。

传递数据到PDF

将数据数组传入视图:

$data = ['message' => 'Hello World'];
$pdf = PDF::loadView('pdfs.custom', $data);
return $pdf->download('custom.pdf');

在您的观点看来?pdfs/custom.blade.php当然,你可以这样显示这些数据:

≤h1>{{ $message }}</h1>

美化PDF文件

Laravel DomPDF 包允许您使用 CSS 样式化您的 PDF:

<style>
    body {
        font-family: 'DejaVu Sans', sans-serif;
    }
    h1 {
        color: #4A90E2;
    }
</style>
<h1>{{ $message }}</h1>

处理大型PDF文件

如果你处理的是大型文档,可能需要将PDF流式传输给用户而不是强制下载:

return $pdf->stream('large.pdf');

该PDF文件会内嵌显示,可以在浏览器中查看。

使用中间件。

为了获得更佳的控制权,比如在访问PDF文件之前需要用户身份验证,你可以使用Laravel中间件。以下是实现方法:

Route::get('/protected-pdf', '[email protected]')->middleware('auth');

这确保只有经过身份验证的用户才能访问此路由。

在服务器上保存PDF文件。

有时,您可能希望将PDF保存到服务器上:

$pdf->save(storage_path('app/public/pdf_name.pdf'));
return response()->download(storage_path('app/public/pdf_name.pdf'));

这将会保存PDF到存储,然后返回给用户。

保护您的PDF文件

您可以为PDF文件设置密码和权限进行加密:

$pdf = PDF::loadView('myPdfView');
$pdf->setEncryption('password');
return $pdf->download('secured.pdf');

这将会对PDF进行加密,使用指定的密码。

正在测试PDF生成。

为了确保PDF生成的完美无缺,您必须编写测试。您可以使用Laravel内置的测试功能来发出请求并断言响应为PDF:

$this->get('/pdf')->assertStatus(200)->assertHeader('Content-Type', 'application/pdf');

结论。

这个教程涵盖了生成和返回PDF文件的基本选项以及更高级的选项,通过添加像这样的包。barryvdh/laravel-dompdf当然,您增强了Laravel生成满足应用程序需求的自定义PDF文件的能力,这可以提高用户的数据呈现和文档质量。

长工码奴1523

长工码奴1523

要在Laravel中生成PDF文件,你可以使用Laravel的内置功能或者第三方库如Fpdf。这里我将介绍两种方法:一种是通过Laravel自带的PDF生成器,另一种是使用Fpdf库。

方法一:使用Laravel自带的PDF生成器

首先确保你已经安装了Laravel及其基本依赖项。然后按照以下步骤操作:

  1. 安装dompdf

    composer require dompdf/dompdf
  2. 创建一个新的控制器来处理PDF请求。

    <?php
    namespace AppHttpControllers;
    
    use IlluminateHttpRequest;
    use DompdfDompdf;
    use AppModelsUser;
    
    class PdfController extends Controller
    {
       public function generatePdf(Request $request)
       {
           // 从数据库查询用户数据
           $users = User::all();
    
           // 创建DOMPDF对象
           $dompdf = new Dompdf();
           $dompdf->loadHtml('<h1>Welcome to Laravel!</h1>');
    
           // 添加用户的列表到HTML字符串
           foreach ($users as $user) {
               $dompdf->addPage();
               $dompdf->setPaper('A4', 'landscape');
               $dompdf->render();
               $path = $dompdf->output();
               return response()->file($path);
           }
       }
    }
  3. 在控制器的routes/web.php文件中注册这个控制器。

    Route::get('/generate-pdf', [PdfController::class, 'generatePdf'])->name('generate_pdf');

现在,当你访问/generate-pdf时,它会下载一个包含所有用户信息的PDF文件。

方法二:使用Fpdf库

如果你需要更高级的功能(例如页面布局、自定义字体等),可以考虑使用Fpdf库。这是一个免费开源的PDF生成库,支持多种语言和格式。

  1. 安装Fpdf:

    composer require fpdf/fpdf
  2. 创建一个新的控制器来处理PDF请求。

    <?php
    namespace AppHttpControllers;
    
    use IlluminateHttpRequest;
    use Fpdf;
    
    class PdfController extends Controller
    {
       public function generatePdf(Request $request)
       {
           // 从数据库查询用户数据
           $users = User::all();
    
           // 创建FPDF实例
           $pdf = new FPDF();
    
           // 设置文档标题
           $pdf->AddPage();
           $pdf->SetFont('Arial', 'B', 20); // 字体大小为20,加粗
           $pdf->Cell(0, 10, 'Welcome to Laravel!', 0, 1);
    
           // 添加用户的列表到PDF
           $i = 1; // 初始索引为1
           foreach ($users as $user) {
               $pdf->Cell(65, 10, $i++, '', 1); // 单元格宽度为65,左对齐,居中
               $pdf->Ln(10); // 换行
               $pdf->Cell(0, 10, $user->email, 0, 1); // 左对齐,无填充,垂直居中
               $pdf->Ln(10); // 换行
               $pdf->Cell(0, 10, $user->username, 0, 1); // 左对齐,无填充,垂直居中
               $pdf->Ln(10); // 换行
               $pdf->Cell(0, 10, $user->password, 0, 1); // 左对齐,无填充,垂直居中
               $pdf->Ln(10); // 换行
               $pdf->Cell(0, 10, $user->created_at, 0, 1); // 左对齐,无填充,垂直居中
               $pdf->Ln(10); // 换行
               $pdf->Cell(0, 10, $user->updated_at, 0, 1); // 左对齐,无填充,垂直居中
               $pdf->Ln(10); // 换行
           }
    
           // 返回PDF文件
           return response()->stream(function () use ($pdf) {
               $pdf->Output('', 'S'); // 输出当前工作表,保存为S格式
           });
       }
    }
  3. 在控制器的routes/web.php文件中注册这个控制器。

    Route::get('/generate-pdf', [PdfController::class, 'generatePdf'])->name('generate_pdf');

现在,当你访问/generate-pdf时,它会下载一个包含所有用户信息的PDF文件。

这两种方法都可以帮助你在Laravel项目中创建PDF文件。根据你的需求选择合适的方法。