跳到內容

CodeIgniter API 參考

CodeIgniter 套件提供一組精簡、以控制器(controller)為主的介面:包裝單一文件的 Pdf 函式庫包裝器(搭配 Services::pdf() 與全域 pdf() 輔助函式)、把已建構文件轉成 DownloadResponse 的回應輔助函式(PdfResponse)、其背後的 Services 工廠(字型/影像登錄表、文件工廠、選用的簽章器與 TSA 用戶端)、NextPdf 組態類別,以及用於透過靜態建構器可呼叫項目非同步產生文件的 GeneratePdfJob

從這裡開始:在控制器中呼叫 Services::pdf()(或 pdf() 輔助函式),用 $pdf->document() 加入內容,再回傳 $pdf->download('file.pdf')。這條路徑就涵蓋了最常見的任務。下方參考表格依介面分類整理;「常見任務」一節會先示範可直接執行的程式樣板。

以下列出最常用的實作流程。每個範例都已對照 nextpdf/codeigniter 原始碼驗證過。

從控制器回傳可下載的 PDF,這是標準的繪製流程:

<?php
declare(strict_types=1);
namespace App\Controllers;
use CodeIgniter\HTTP\DownloadResponse;
use NextPDF\CodeIgniter\Config\Services;
final class InvoiceController extends BaseController
{
public function download(int $id): DownloadResponse
{
$pdf = Services::pdf();
$pdf->document()->addPage();
$pdf->document()->cell(0, 10, "Invoice #{$id}");
return $pdf->download("invoice-{$id}.pdf");
}
}

這段程式會 resolve(解析)取得一個全新的 Pdf,包裝一個全新的 Document,寫入一個儲存格,並回傳一個 DownloadResponse,帶有 attachment 處置方式與套件安全標頭。

在瀏覽器中內嵌預覽 PDF,使用同一個包裝器,改用 inline() 而非 download()

<?php
declare(strict_types=1);
namespace App\Controllers;
use CodeIgniter\HTTP\DownloadResponse;
final class ReportController extends BaseController
{
public function preview(): DownloadResponse
{
$pdf = pdf();
$pdf->document()->addPage();
$pdf->document()->cell(0, 10, 'Monthly Report');
return $pdf->inline('report.pdf');
}
}

這段程式會使用全域 pdf() 輔助函式(等同於 Services::pdf()),並回傳一個 DownloadResponse,帶有 inline 處置方式,讓瀏覽器直接顯示 PDF,而不是下載。

在佇列上非同步產生 PDF,把帶有靜態建構器的 GeneratePdfJob 推入佇列:

<?php
declare(strict_types=1);
use NextPDF\CodeIgniter\Jobs\GeneratePdfJob;
service('queue')->push('pdf', GeneratePdfJob::class, [
'builder' => 'App\PdfBuilders\InvoiceBuilder::build',
'outputPath' => WRITEPATH . 'pdfs/invoice-42.pdf',
'context' => ['invoice_id' => 42],
]);

這段程式會將產生作業排入佇列。worker 會驗證建構器(必須是 App\PdfBuilders\...::method 形式的靜態可呼叫項目)與輸出路徑(必須解析到 WRITEPATH/pdfs/ 底下並以 .pdf 結尾),建構一個全新文件,然後將其儲存。

當你持有一個 Pdf 包裝器,並需要使用其回應或儲存方法時,請參考這張表格。

符號參數預設行為回傳擲回或失敗於備註
NextPDF\CodeIgniter\Libraries\Pdf / new Pdf(Document $document)document:全新的核心文件。包裝提供的文件,供單次回應或儲存作業使用。Pdf預期不會發生。輸出之後請勿重複使用該包裝器。
Pdf::document()無。回傳被包裝的文件。NextPDF\Core\Document預期不會發生。用它來呼叫核心的編寫 API。
Pdf::inline(string $filename = 'document.pdf')filename:回應檔名。瀏覽器內嵌(inline)處置方式。CodeIgniter\HTTP\DownloadResponse核心序列化錯誤。委派給 PdfResponse::inline()
Pdf::download(string $filename = 'document.pdf')filename:回應檔名。瀏覽器附件(attachment)處置方式。DownloadResponse核心序列化錯誤。委派給 PdfResponse::download()
Pdf::streamInline(string $filename = 'document.pdf')filename:回應檔名。與其他 Framework(框架)套件維持 API 一致。DownloadResponse核心序列化錯誤。CodeIgniter 原生即可處理二進位輸出。
Pdf::streamDownload(string $filename = 'document.pdf')filename:回應檔名。與其他框架套件維持 API 一致。DownloadResponse核心序列化錯誤。使用與非串流回應相同的大小控制項。
Pdf::save(string $path)path:檔案系統的目標路徑。寫出被包裝的文件。void檔案系統或核心寫入錯誤。儲存前請先驗證儲存根目錄。

當你需要特定的服務工廠或全域輔助函式,並想知道其共用行為與回傳型別時,請參考這張表格。

符號參數預設行為回傳擲回或失敗於備註
Services::fontRegistry(bool $getShared = true)getShared:CodeIgniter 共用服務旗標。共用登錄表,會以已設定的字型預熱,然後鎖定。FontRegistryInterfaceRuntimeException:缺少擴充功能或字型路徑不安全時。拒絕 fontsPath 中的串流包裝器與空位元組。
Services::imageRegistry(bool $getShared = true)getShared:共用服務旗標。共用且有界限的 LRU 影像登錄表。ImageRegistry預期不會發生。快取大小由 imageCacheMb 控制。
Services::documentFactory(bool $getShared = true)getShared:共用服務旗標。使用共用登錄表的共用工廠。DocumentFactoryInterface登錄表設定錯誤。工廠可重複使用;文件不可重複使用。
Services::tsaClient(bool $getShared = true)getShared:共用服務旗標。tsa.url 為空時回傳 null用戶端 `TsaClientnull`HTTP 用戶端或 TSA 組態錯誤。
Services::pdfSigner(bool $getShared = false)getShared:共用服務旗標。當簽章功能停用時回傳 null簽章器介面 `SignerInterfacenull`憑證或簽章層級的錯誤。
Services::pdfDocument(bool $getShared = false)getShared:共用服務旗標。建立一個全新文件,套用預設值,並選擇性地設定 PDF/A 或 Artisan。Document選用的擴充功能或文件設定錯誤。為了請求安全,請保留預設值 false
Services::pdf(bool $getShared = false)getShared:共用服務旗標。建立一個全新的 Pdf 包裝器,包裝一個全新文件。NextPDF\CodeIgniter\Libraries\Pdf文件設定錯誤。主要的面向控制器服務。
Services::eInvoiceEmbedder()無。除非存在 Premium Pro 電子發票嵌入器類別,否則回傳 null嵌入器介面 `EmbedderInterfacenull`選用套件的建構錯誤。
Services::eInvoiceValidator()無。除非存在 Premium Enterprise 驗證器類別,否則回傳 null驗證器介面 `ValidatorInterfacenull`選用套件的建構錯誤。
Services::eInvoiceProfile()無。已安裝 Premium Pro 時回傳 EN16931 設定檔。設定檔介面 `ProfileInterfacenull`選用套件的錯誤。
Services::schematronRunner()無。除非存在 Premium Enterprise 的 Schematron 驗證器,否則回傳 null執行器介面 `SchematronRunnerInterfacenull`選用套件的建構錯誤。
Registrar::Autoload()無。將套件輔助函式加入 CodeIgniter 的 autoload 組態。array預期不會發生。模組載入後會啟用 pdf()pdf_document()
pdf()無。呼叫 Services::pdf(false)Pdf文件設定錯誤。供控制器使用的便利輔助函式。
pdf_document()無。呼叫 Services::pdfDocument(false)Document文件設定錯誤。偏好使用核心文件 API 時的便利輔助函式。

當你已經持有一個已建構的 Document,並想自行建構 DownloadResponse 而不透過 Pdf 包裝器時,請參考這張表格。

符號參數預設行為回傳擲回或失敗於備註
PdfResponse::inline(Document $document, string $filename = 'document.pdf')document:已建構的文件;filename:回應檔名。確保具備 .pdf 副檔名與內嵌處置方式。DownloadResponse核心序列化錯誤。加入 PDF 內容類型與防禦性標頭。
PdfResponse::download(Document $document, string $filename = 'document.pdf')inline 相同;處置方式為 attachment。確保具備 .pdf 副檔名。DownloadResponseinline 相同。用於瀏覽器下載。
PdfResponse::streamInline(Document $document, string $filename = 'document.pdf')inline 相同。在 CI4 中與 inline 行為相同。DownloadResponseinline 相同。為了跨框架 API 一致而存在。
PdfResponse::streamDownload(Document $document, string $filename = 'document.pdf')download 相同。在 CI4 中與 download 行為相同。DownloadResponsedownload 相同。為了跨框架 API 一致而存在。

當你串接非同步產生流程,並需要精確掌握工作資料鍵與建構器可呼叫項目的契約時,請參考這張表格。

符號參數預設行為回傳擲回或失敗於備註
GeneratePdfJob::process()工作資料鍵:builderoutputPath,以及選用的 context省略時使用空的 context 陣列。voidInvalidArgumentException:建構器或輸出路徑不安全時;以及核心寫入錯誤。建構器必須是 App\PdfBuilders\...\*::method
建構器可呼叫項目Document $docarray $context除了工作資料外沒有預設的 context。Document建構器特定的例外。必須是靜態可呼叫項目,因為 CI4 佇列酬載是序列化後的資料。

當你要在 NextPdf 組態類別變更預設值(頁面格式、路徑、簽章、TSA 或文件中繼資料)時,請參考這張表格。

屬性型別預設行為備註
pageFormatstringA4預設頁面格式。
orientationstringP預設方向。
unitstringmm預設單位。
pdfa`stringnull`null
fontsPath / cachePathstringWRITEPATH . 'fonts'WRITEPATH . 'cache/nextpdf'請將路徑保留在應用程式可控制的儲存範圍內。
signaturearray以等級 B-B 停用。憑證、金鑰、密碼、額外憑證與等級。
tsaarray當 URL 為 null 時停用;逾時為 30 秒。憑證資訊、mTLS 檔案、公鑰釘選與 HTTP 政策。
ocspCachearray已啟用,TTL 為 86400 秒。可用時供簽章驗證流程使用。
preloadFontslist<string>空的。在登錄表鎖定之前預熱。
imageCacheMbint50控制行程生命週期內的影像快取。
fontCacheLockingbooltrue讓字型登錄表的變更不會影響請求處理。
artisanarray除非已設定並安裝,否則 Chrome renderer(渲染器)預設為停用。對映到 ChromeRendererConfig::fromArray()
defaultsarray建立者為 NextPDF,作者留空,語言為 en,並搭配預設邊界與字型。Services::pdfDocument() 只套用 creatorlanguage,以及(非空時的)authormargin_top/right/bottom/leftfont_familyfont_sizetrim_boxbleed_box 等鍵則是已定義但目前尚未套用的預設值。
  • GeneratePdfJob 將輸出限制在 WRITEPATH . 'pdfs',且要求以 .pdf 結尾。
  • 位於 App\PdfBuilders 之外的建構器可呼叫項目會被拒絕,以避免從遭竄改的佇列酬載執行任意程式碼。
  • 控制器流程請使用 service('pdf') 或套件輔助函式;長時間執行的產生作業則請使用佇列工作。