docdigital/pdf-manager
PdfManager is a lightweight PHP/Laravel component for basic PDF management. Merge multiple PDFs into one or split a PDF into separate files, making common document workflows simple to automate in your app.
Installation
composer require docdigital/pdf-manager
Ensure dompdf/dompdf is also installed (dependency):
composer require dompdf/dompdf
Basic Usage
use DocDigital\PdfManager\PdfManager;
$pdfManager = new PdfManager();
$mergedPdf = $pdfManager->merge(['path/to/file1.pdf', 'path/to/file2.pdf']);
$mergedPdf->save('merged_output.pdf');
First Use Case
dompdf integration to create PDFs dynamically.Usage section for basic examples.src/PdfManager.php for core methods (merge, split, generateFromHtml).tests/ for edge cases and validation logic.Merging PDFs
$pdfManager = new PdfManager();
$mergedPdf = $pdfManager->merge(['file1.pdf', 'file2.pdf']);
$mergedPdf->save(storage_path('app/merged.pdf'));
$files = Storage::files('pdfs/to/merge');
$merged = $pdfManager->merge($files);
Splitting PDFs
$pdfManager->split('input.pdf', [1, 3, 5]) // Extract pages 1, 3, 5
->save('output_page1.pdf', 'output_page3.pdf', 'output_page5.pdf');
$pdfManager->split('input.pdf', [1, 3, '5-7']); // Pages 1, 3, and 5-7
Dynamic PDF Generation
$html = '<h1>Hello, PDF!</h1><p>Generated via PdfManager.</p>';
$pdf = $pdfManager->generateFromHtml($html);
$pdf->save('dynamic.pdf');
$pdf = $pdfManager->generateFromHtml(view('pdf.invoice', ['data' => $order]));
Integration with Laravel Storage
use Illuminate\Support\Facades\Storage;
$files = Storage::disk('s3')->files('pdfs');
$merged = $pdfManager->merge($files);
Storage::disk('s3')->put('merged.pdf', $merged->output());
try-catch for file operations:
try {
$pdfManager->merge($files)->save('output.pdf');
} catch (\Exception $e) {
Log::error("PDF merge failed: " . $e->getMessage());
}
$pdfManager->merge($files)->streamTo(storage_path('app/large.pdf'));
MergePdfJob::dispatch($files, 'output.pdf')->onQueue('pdfs');
File Paths
storage_path()/public_path():
$pdfManager->merge([storage_path('file1.pdf'), storage_path('file2.pdf')]);
Memory Limits
memory_limit.memory_limit in php.ini or stream output incrementally.Dompdf Dependencies
dompdf properly (see Dompdf docs).Page Count Mismatch
split() may fail if page numbers exceed the PDF’s total pages.$pageCount = $pdfManager->getPageCount('input.pdf');
if (max($pagesToExtract) > $pageCount) {
throw new \InvalidArgumentException("Page exceeds total pages.");
}
Encoding Issues
$safePath = Str::slug('filename with spaces.pdf');
$pdfManager->setDompdfOption('isRemoteEnabled', true);
$pdfManager->setDompdfOption('isHtml5ParserEnabled', true);
/tmp. Verify permissions.file_exists() to confirm files before processing:
$files = array_filter($files, 'file_exists');
Custom Dompdf Configuration Override default Dompdf settings:
$pdfManager->setDompdfOption('defaultFont', 'DejaVu Sans');
$pdfManager->setDompdfOption('isPhpEnabled', true);
Add Watermarks
Extend the PdfManager class to add watermarks before merging:
class WatermarkedPdfManager extends PdfManager {
public function addWatermark($pdfContent, $watermarkText) {
// Use TCPDF or Imagick to add watermark
return $pdfContent;
}
}
Laravel Service Provider
Bind PdfManager to the container for dependency injection:
// app/Providers/AppServiceProvider.php
public function register() {
$this->app->singleton(PdfManager::class, function () {
return new PdfManager();
});
}
Artisan Commands Create CLI tools for batch processing:
// app/Console/Commands/MergePdfs.php
public function handle() {
$pdfManager = app(PdfManager::class);
$merged = $pdfManager->merge($this->getFiles());
$merged->save(storage_path('app/merged.pdf'));
}
How can I help you explore Laravel packages today?