×

Cách viết class để chia nhỏ và ghép file PDF trong PHP

Việc xử lý file PDF trong PHP có thể trở nên rất dễ dàng và hiệu quả nếu bạn biết cách viết một class phù hợp để chia nhỏ và ghép file. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách tạo ra một class PHP có khả năng chia nhỏ (split) và ghép (merge) file PDF một cách linh hoạt và dễ dàng.

Tổng quan về việc xử lý PDF trong PHP

PDF (Portable Document Format) là định dạng file rất phổ biến được sử dụng để lưu trữ văn bản và hình ảnh. Khi làm việc với PDF, bạn có thể gặp phải nhiều tình huống cần phải chia nhỏ hoặc ghép file. Ví dụ, có thể bạn cần lấy một vài trang từ một tài liệu lớn hoặc kết hợp nhiều tài liệu thành một file duy nhất.

Để thực hiện những thao tác này trong PHP, chúng ta có thể sử dụng một thư viện như FPDI, TCPDF hay FPDF. Trong bài viết này, chúng ta sẽ sử dụng FPDI kết hợp với FPDF để xây dựng class của mình.

Cài đặt thư viện FPDI và FPDF

Trước tiên, bạn cần cài đặt cả hai thư viện thông qua Composer. Mở terminal và chạy lệnh sau:

composer require setasign/fpdf
composer require setasign/fpdi

Tạo lớp PDFHandler

Bây giờ, chúng ta sẽ tạo một class có tên là PDFHandler, bao gồm các phương thức để chia nhỏ và ghép file PDF.

<?php

require 'vendor/autoload.php';

use setasign\Fpdi\Fpdi;

class PDFHandler
{
    private $pdf;

    public function __construct()
    {
        $this->pdf = new Fpdi();
    }

    // Phương thức để chia nhỏ file PDF
    public function splitPDF($filePath, $startPage, $endPage, $outputPath)
    {
        if (!file_exists($filePath)) {
            throw new Exception("File không tồn tại.");
        }

        // Đếm số trang trong file PDF
        $pageCount = $this->pdf->setSourceFile($filePath);

        if ($startPage < 1 || $endPage > $pageCount || $startPage > $endPage) {
            throw new Exception("Số trang không hợp lệ.");
        }

        $this->pdf->AddPage();

        for ($pageNo = $startPage; $pageNo <= $endPage; $pageNo++) {
            $templateId = $this->pdf->importPage($pageNo);
            $size = $this->pdf->getTemplatesSize($templateId);
            $this->pdf->AddPage($size['orientation'], [$size['width'], $size['height']]);
            $this->pdf->useTemplate($templateId);
        }

        // Lưu file PDF đã chia nhỏ
        $this->pdf->Output('F', $outputPath);
        return "File PDF đã được chia nhỏ và lưu tại: {$outputPath}";
    }

    // Phương thức để ghép file PDF
    public function mergePDF($files, $outputPath)
    {
        foreach ($files as $file) {
            if (!file_exists($file)) {
                throw new Exception("File {$file} không tồn tại.");
            }
            $pageCount = $this->pdf->setSourceFile($file);

            for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
                $this->pdf->AddPage();
                $templateId = $this->pdf->importPage($pageNo);
                $size = $this->pdf->getTemplatesSize($templateId);
                $this->pdf->AddPage($size['orientation'], [$size['width'], $size['height']]);
                $this->pdf->useTemplate($templateId);
            }
        }

        // Lưu file PDF đã ghép
        $this->pdf->Output('F', $outputPath);
        return "File PDF đã được ghép và lưu tại: {$outputPath}";
    }
}

Giải thích mã nguồn

  • Constructor: Khởi tạo một đối tượng của FPDI để bắt đầu làm việc với file PDF.
  • splitPDF: Nhận vào đường dẫn đến file PDF gốc, số trang bắt đầu và số trang kết thúc, và đường dẫn để lưu file chia nhỏ. Phương thức này sẽ kiểm tra tính hợp lệ của các tham số và sau đó chia nhỏ file PDF theo yêu cầu.
  • mergePDF: Nhận vào một mảng các đường dẫn đến file PDF cần ghép và đường dẫn để lưu file kết quả. Phương thức này sẽ kiểm tra từng file xem có tồn tại hay không trước khi ghép chúng lại với nhau.

Cách sử dụng class PDFHandler

Bây giờ, chúng ta sẽ xem cách sử dụng class PDFHandler để chia nhỏ và ghép file PDF.

// Tạo một đối tượng PDFHandler
$pdfHandler = new PDFHandler();

// Chia nhỏ file PDF
try {
    echo $pdfHandler->splitPDF('path/to/input.pdf', 1, 3, 'path/to/output_split.pdf');
} catch (Exception $e) {
    echo 'Lỗi: ' . $e->getMessage();
}

// Ghép file PDF
try {
    $filesToMerge = [
        'path/to/first.pdf',
        'path/to/second.pdf',
    ];
    echo $pdfHandler->mergePDF($filesToMerge, 'path/to/output_merged.pdf');
} catch (Exception $e) {
    echo 'Lỗi: ' . $e->getMessage();
}

Kết luận

Trong bài viết này, chúng ta đã xây dựng một class PHP có khả năng chia nhỏ và ghép file PDF một cách đơn giản. Việc sử dụng thư viện FPDI giúp chúng ta dễ dàng thực hiện các thao tác này mà không cần tỉnh chỉnh file PDF một cách thủ công. Hy vọng rằng class PDFHandler sẽ hữu ích cho bạn trong việc xử lý các file PDF trong dự án của mình. Nếu bạn có bất kỳ câu hỏi nào hoặc cần thêm thông tin, hãy để lại lời nhắn để được hỗ trợ!

Comments