alexanderpavlov/pdfmerger
A lightweight PHP library for merging multiple PDF files into a single document. Useful for batching reports, invoices, and attachments with simple, programmatic control over input order and output file creation.
Installation Add the package via Composer:
composer require alexanderpavlov/pdfmerger
Register the service provider in config/app.php (if not auto-discovered):
'providers' => [
// ...
AlexanderPavlov\PdfMerger\PdfMergerServiceProvider::class,
],
First Use Case: Merging Two PDFs
use AlexanderPavlov\PdfMerger\Facades\PdfMerger;
$mergedPdf = PdfMerger::merge([
public_path('file1.pdf'),
public_path('file2.pdf'),
])->save(public_path('merged.pdf'));
Where to Look First
PdfMerger (for quick usage).PdfMergerServiceProvider (for configuration).Merging PDFs from Storage
$pdfs = Storage::disk('local')->files('pdfs/');
$merged = PdfMerger::merge($pdfs)->save(storage_path('merged.pdf'));
Merging with Custom Output Paths
$outputPath = storage_path('reports/merged_{date}.pdf');
PdfMerger::merge($pdfPaths)->save(str_replace('{date}', now()->format('Y-m-d'), $outputPath));
Streaming Merged PDFs to Browser
return response()->streamDownload(
function () use ($pdfPaths) {
$merged = PdfMerger::merge($pdfPaths);
echo $merged->getContent();
},
'merged_report.pdf'
);
Integration with Laravel Queues
MergePdfs::dispatch($pdfPaths, $outputPath)
->onQueue('pdf-processing');
// Job class
public function handle() {
PdfMerger::merge($this->pdfPaths)->save($this->outputPath);
}
Merging with Page Ranges
$pdfs = [
'file1.pdf' => ['pages' => '1-5'], // Merge only pages 1 to 5
'file2.pdf' => ['pages' => 'all'],
];
PdfMerger::merge($pdfs)->save('output.pdf');
Storage facade to dynamically fetch PDF paths.Cache facade).PHP5 Compatibility
Memory Limits
memory_limit. Increase it temporarily:
ini_set('memory_limit', '512M');
File Permissions
chmod -R 775 storage/
storage/logs/laravel.log) for permission errors.Encoding Issues
Str::slug() or urlencode():
$safePath = urlencode($outputPath);
Silent Failures
if (!PdfMerger::isValidPdf($path)) {
throw new \InvalidArgumentException("Invalid PDF: {$path}");
}
PdfMerger::merge($pdfs)->save(temp_path('debug_merged.pdf'));
PdfMerger for reproducibility.Custom Merge Logic
Override the merger class (extend PdfMerger) to add pre/post-processing:
class CustomPdfMerger extends \AlexanderPavlov\PdfMerger\PdfMerger {
public function merge(array $pdfs) {
// Add custom logic (e.g., watermarking)
return parent::merge($pdfs);
}
}
Bind it in the service provider:
$this->app->bind('pdfmerger', function () {
return new CustomPdfMerger();
});
Event Listeners Dispatch events before/after merging (e.g., for analytics):
PdfMerger::merge($pdfs)->save($output)
->then(function () {
event(new PdfMerged($output));
});
Configuration
Override defaults in config/services.php (if the package supports it):
'pdfmerger' => [
'temp_dir' => storage_path('temp'),
'debug' => env('PDFMERGER_DEBUG', false),
],
tcpdf or dompdf for this.How can I help you explore Laravel packages today?