」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 在 Laravel 中產生 PDF 文檔

在 Laravel 中產生 PDF 文檔

發佈於2024-08-16
瀏覽:884

Generating PDF documents in Laravel

Laravel 和 DomPDF:使用图像和 CSS 生成 PDF 文档的分步指南

创建 PDF 文档是 Web 应用程序中的常见要求,尤其是生成发票、收据、证书、票据和各种报告。在这个综合教程中,我们将深入研究如何使用 Laravel 和 DomPDF 生成带有图像和 CSS 的 PDF 文档。我们将介绍配置选项、设计注意事项、输出大小、性能和数据库查询。此外,我们还将讨论处理分页符、使用 base64 加载图像等的提示和技巧。

先决条件

在我们开始之前,请确保您已安装以下软件:

  • PHP >=8.2
  • 作曲家 2
  • Laravel 10

介绍

DomPDF 是一个流行的 PHP 库,允许您从 HTML 内容生成 PDF 文档。它支持 CSS 样式、图像和各种配置选项。通过将 DomPDF 与 Laravel 集成,您可以使用 Blade 模板和 Laravel 的强大功能轻松创建复杂的 PDF 文档。

其他流行的 PDF 库包括 TCPDF、FPDF 和 Snappy。

然而,DomPDF 由于其易于集成和强大的功能集而被广泛使用。

在本教程中,我们将逐步介绍设置 Laravel 项目、配置 DomPDF、创建处理 PDF 生成的控制器、为 PDF 内容设计 Blade 模板、添加路由和优化性能的过程。我们还将讨论高级配置选项并提供生成高质量 PDF 文档的提示和技巧。

假设

本教程假设您对 Laravel 和 PHP 有基本的了解。如果您是 Laravel 新手,请考虑阅读官方 Laravel 文档来熟悉该框架。否则,您可以按照 Laravel Bootcamp 开始使用 Laravel。

第 1 步:设置 Laravel 项目

首先,如果你还没有Laravel项目,请创建一个新的Laravel项目,或者使用现有的项目,当然,如果你已经有Laravel项目,你可以跳过这一步。

composer create-project --prefer-dist laravel/laravel pdf-tutorial
cd pdf-tutorial

接下来,安装DomPDF:

composer require barryvdh/laravel-dompdf

发布配置文件:

php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"

第2步:配置DomPDF

打开config/dompdf.php文件。配置文件包含用于自定义 PDF 输出的各种选项。在这里您可以设置各种选项,包括默认纸张尺寸、方向、字体等。

  • 纸张尺寸: 您可以设置默认纸张尺寸。
  'default_paper_size' => 'a4',
  • 方向: 设置默认方向(纵向或横向)。
  'orientation' => 'portrait',
  • 字体:您可以指定默认字体并添加自定义字体。
  'default_font' => 'serif',

第三步:创建控制器

创建一个控制器来处理 PDF 生成:

php artisan make:controller PDFController

在app/Http/Controllers/PDFController.php中,添加以下代码:

 'Laravel PDF Example',
            'date' => date('m/d/Y'),
        ];

        $pdf = PDF::loadView('myPDF', $data);

        return $pdf->download('document.pdf');
    }
}

第 4 步:创建刀片模板

为 PDF 内容创建 Blade 模板:

touch resources/views/myPDF.blade.php

将以下内容添加到myPDF.blade.php:



    Laravel PDF Example
    


    

{{ $title }}

Date: {{ $date }}

This is an example of a PDF document generated using Laravel and DomPDF.

第5步:添加路由

在routes/web.php中添加处理PDF生成的路由:

use App\Http\Controllers\PDFController;

Route::get('generate-pdf', [PDFController::class, 'generatePDF']);

第 6 步:添加图像

您可以通过将图像嵌入为 Base64 编码字符串或使用 URL 来将图像添加到 PDF。

图像可以使用base64编码直接嵌入到Blade模板中。例如,要嵌入来自 public/images 的图像,可以这样做:

Logo

或直接从 URL:

Logo

第 7 步:优化性能

数据库查询

处理大型数据集(例如 1,000 条记录)时,使用分页或分块来管理内存使用情况:

$data = DB::table('users')->paginate(50);

$pdf = PDF::loadView('myPDF', ['data' => $data]);

输出尺寸

要减小输出大小,请尽量减少使用大量图像,并尽可能选择矢量图形。另外,使用高效的 CSS。

分页符

确保内容结构良好,适合分页。使用CSS处理分页符:

.page-break {
    page-break-after: always;
}

在您的 Blade 模板中:

步骤8:高级配置

更多高级配置,请参考DomPDF文档。您可以自定义几乎所有内容,从边距到字体加载方式。

使用自定义字体

要使用自定义字体,首先,将它们添加到您的项目中并配置 DomPDF 以使用它们:

'custom_font_dir' => base_path('resources/fonts/'),
'custom_font_data' => [
    'custom-font' => [
        'R' => 'CustomFont-Regular.ttf',
        'B' => 'CustomFont-Bold.ttf',
    ]
],

在您的 Blade 模板中:


结论

通过遵循此分步指南,您可以使用 Laravel 和 DomPDF 生成复杂的 PDF 文档,并包含图像和 CSS 样式。本教程涵盖了基本的配置选项、设计注意事项、性能优化。您可以扩展此基础,为您的 Laravel 应用程序构建强大的文档生成系统。

潜在系列和存储库

本教程是使用 Laravel 生成 PDF 系列的一部分。可以在此处找到包含各种文档模板(发票、收据、证书、票据等)的完整存储库。请随意贡献并扩大收藏。

编码愉快!

版本聲明 本文轉載於:https://dev.to/alphaolomi/generating-pdf-documents-in-laravel-n07?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-06-05
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-06-05
  • 如何使用node-mysql在單個查詢中執行多個SQL語句?
    如何使用node-mysql在單個查詢中執行多個SQL語句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    程式設計 發佈於2025-06-05
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-06-05
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的Python功能Eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。 This article delves into the differences betwee...
    程式設計 發佈於2025-06-05
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-06-05
  • 在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8表中將latin1字符轉換為utf8 ,您遇到了一個問題,其中含義的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致電。為了解決此問題,您正在嘗試使用“ mb_convert_encoding”和“ iconv”轉換受...
    程式設計 發佈於2025-06-05
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-06-05
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-06-05
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-06-05
  • 如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    在Visual Studio 2012 儘管已安裝了MySQL Connector v.6.5.4,但無法將MySQL數據庫添加到實體框架的“ DataSource對話框”中。為了解決這一問題,至關重要的是要了解MySQL連接器v.6.5.5及以後的6.6.x版本將提供MySQL的官方Visual...
    程式設計 發佈於2025-06-05
  • 在Pandas中如何將年份和季度列合併為一個週期列?
    在Pandas中如何將年份和季度列合併為一個週期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 這個目標是通過組合“年度”和“季度”列來創建一個新列,以獲取以下結果: [python中的concate...
    程式設計 發佈於2025-06-05
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-06-05
  • C++中如何將獨占指針作為函數或構造函數參數傳遞?
    C++中如何將獨占指針作為函數或構造函數參數傳遞?
    在構造函數和函數中將唯一的指數管理為參數 unique pointers( unique_ptr [2啟示。通過值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法將唯一指針的所有權轉移到函數/對象。指針的內容被移至功能中,在操作...
    程式設計 發佈於2025-06-05
  • Android如何向PHP服務器發送POST數據?
    Android如何向PHP服務器發送POST數據?
    在android apache httpclient(已棄用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    程式設計 發佈於2025-06-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3