How to overlay HTML generated PDF on top of existing PDF? - php

I'm looking to start with an initial PDF file, one that has graphics and text, and then take some html code which has dynamic values for some user input, generate that as a PDF, hopefully either using the initial PDF as a background, OR somehow running a PHP script afterwards to "merge" both PDF where one acts as a background to another.
I have some code that renders an HTML formatted PDF: (using DOMPDF)
$initialpdf = file_get_contents('file_html.html');
$initialpdf = str_replace(array(
'%replaceText1%',
'%replaceText2%'
), array (
$replaceText1,
$replaceText2,
), $initialpdf);
$fp = fopen('file_html_new.html','w');
file_put_contents('file_html_new.html', $initialpdf);
require_once("dompdf/dompdf_config.inc.php");
spl_autoload_register('DOMPDF_autoload');
function pdf_create($html, $filename, $paper, $orientation, $stream=TRUE)
{
$dompdf = new DOMPDF();
$dompdf->set_paper($paper,$orientation);
$dompdf->load_html($html);
$dompdf->render();
$pdf = $dompdf->output();
#file_put_contents($filename . ".pdf", $pdf);
}
$filename = 'HTML_Generated_pdf';
$dompdf = new DOMPDF();
$html = file_get_contents('file_html_new.html');
pdf_create($html,$filename,'Letter','landscape');
The code above takes html file "file_html.html" and does string replacements with user input values, renders this as a new HTML file called "file_html_new.html" and then renders that AS a PDF.
I also have other PHP code that render a PDF by having a PDF as an initial source: (using FPDF)
<?php
ob_clean();
ini_set("session.auto_start", 0);
define('FPDF_FONTPATH','font/');
define('FPDI_FONTPATH','font/');
require('fpdf.php');
require('fpdi.php');
$pdf = new FPDI();
$pdf->setSourceFile("/home/user/public_html/wp-content/myPDF.pdf");
$tplIdx = $pdf->importPage(1);
$specs = $pdf->getTemplateSize($tplIdx);
$pdf->addPage($specs['h'] > $specs['w'] ? 'P' : 'L', 'Letter');
$pdf->useTemplate($tplIdx, 0, 0);
$pdf->SetFont('helvetica');
$pdf->SetXY(30, 30);
$pdf->Write(0, $replaceText1);
ob_end_clean();
$pdf->Output('New_Generated_PDF.pdf', 'F');
?>
This takes an already existing PDF, "myPDF.pdf", and uses it as a background, writing some passed in value to the document, and saving the newly produced document.
While this is essentially what I want to do, I need to work with html because the exact formatting for text gets rigorous and almost impossible to do just by plotting it in manually.
I'm open to using DOMPDF, FPDF, FPDI, TCPDF, or any other PHP resource in order to accomplish this.
Is there a way to fuse the two ways I have above?

For sure you can use different existing PDF documents with FPDI, too. This code should show you the concept (actually I guess that all page formats are A4 portrait):
<?php
$pdf = new FPDI();
// let's get an id for the background template
$pdf->setSourceFile('myPDF.pdf');
$backId = $pdf->importPage(1);
// iterate over all pages of HTML_Generated_pdf.pdf and import them
$pageCount = $pdf->setSourceFile('HTML_Generated_pdf.pdf');
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
// add a page
$pdf->AddPage();
// add the background
$pdf->useTemplate($backId);
// import the content page
$pageId = $pdf->importPage($pageNo);
// add it
$pdf->useTemplate($pageId);
}
$pdf->Output();

Related

Merge two pdfs with Ilovepdf and dompdf

I have a code to convert an html text into pdf and another to merge this pdf with a pdf that the user uploads, but I can't merge the two together, it downloads the converted pdf and not the merged one.
When I put just to merge with two files that the user uploads it works.
My code:
$dompdf = new Dompdf();
$dompdf->loadHtml('hello world');
// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
$arquivo = $dompdf->stream();
$ilovepdf = new Ilovepdf('iLovePdfKey', 'iLovePdfKey');
// Create a new task
$myTaskMerge = $ilovepdf->newTask('merge');
// Add files to task for upload
$arquivo = $this->convertHello();
$file1 = $myTaskMerge->addFile('path to the file that the user upload');
$file2 = $myTaskMerge->addFile($arquivo);
// Execute the task
$myTaskMerge->execute();
// Download the package files
$myTaskMerge->download();
$dompdf->stream() sends the rendered PDF to the browser. As such you can't access the generated PDF that way. You have to capture the output and save to a file.
Based on your sample code, something like this:
$dompdf = new Dompdf();
$dompdf->loadHtml('hello world');
$dompdf->render();
$arquivo = $dompdf->output();
$tmp = tempnam(sys_get_temp_dir(), "pdf")
file_put_contents($tmp, $arquivo);
$ilovepdf = new Ilovepdf('iLovePdfKey', 'iLovePdfKey');
$myTaskMerge = $ilovepdf->newTask('merge');
$file1 = $myTaskMerge->addFile('path to the file that the user upload');
$file2 = $myTaskMerge->addFile($tmp);
$myTaskMerge->execute();
unset($tmp);
$myTaskMerge->download();

Trying to populate pdf template with user input

I have a pdf template that I made. I am working on a real estate website that asks users for information regarding their properties and displays those answers neatly in a pdf flyer that they can download. My question is what is the best way to go about this?
I downloaded FPDI so I can work off an existing template but I dont see how I can pass PHP variables to the Write() function.
I also downloaded TCPDF but I cant seem to get it to work together with FPDI.
use setasign\Fpdi\Fpdi;
require_once('vendor/setasign/fpdf/fpdf.php');
require_once('vendor/setasign/fpdi/src/autoload.php');
require_once('vendor/tecnickcom/tcpdf/tcpdf.php');
//initiate FPDI
$pdf = new Fpdi();
$date = Date('d - m - Y');
$pageCount = $pdf->setSourceFile('C:/Users/19292/Desktop/flyer-template.pdf');
$pdf->SetFont('Helvetica');
$pdf->SetTextColor(255, 0, 0);
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
if($pageNo === 1) {
//If its the first page of your pdf
$templateId = $pdf->importPage($pageNo);
$pdf->AddPage();
$pdf->useTemplate($templateId, ['adjustPageSize' => true]);
$pdf->SetXY(10, 10);
$pdf->Write(0, 'Title to the left on your first page');
$pdf->write($date,true,0,false,false,'left');
} else if($pageNo === 2) {
$templateId = $pdf->importPage($pageNo);
$pdf->AddPage();
$pdf->useTemplate($templateId, ['adjustPageSize' => true]);
$pdf->SetXY(220, 10);
}
}
$pdf->Output();
?>
not sure what exactly should be required, what should be used to get the output that I want.

Get Text in specific location of PDF FILE

I am working on how to merge pdf_file1 to pdf_file2. I need to merge pdf_file1 to specific pages in file 2. to be able to do that I need to find specific keyword in header of pdf_file2
EX: If (keyword == header_of_pdf_file2) then
Merge file
here is my current code to merge the 2 pdf
<?php
require_once('fpdf.php');
require_once('fpdi.php');
$pdf = new FPDI();
$pdf->setSourceFile("pdf_file1");
$tplIdxA = $pdf->importPage(1, '/MediaBox');
$pagecnt=$pdf->setSourceFile("pdf_file2.pdf");
$x=1;
for($i=0; $i<$pagecnt; $i++){
$tplIdxB = $pdf->importPage(intval($i+1), '/MediaBox');
$pdf->addPage();
// place the imported page of the first document:
if($i==0){
$pdf->useTemplate($tplIdxA, 0, 0, 210,300);
// place the imported page of the snd document:
}
$pdf->useTemplate($tplIdxB, 0, 0, 200,295);
$x=($i+1)*20;
}
$pdf->Output();

FPDF error: Template does not exist! fpdf

So I am trying to modify a pdf template with php.
I looked around and found out most people use FPDI and I gave it a try.
So What i did was
include('pdf/fpdf.php');
include('pdf/fpdi.php');
// initiate FPDI
$pdf = new FPDI();
// add a page
$pdf->AddPage();
// set the sourcefile
$pagecount = $pdf->setSourceFile('pdf/menu_blanka.pdf');
// import page 1
$template = $pdf->importPage($pagecount);
// use the imported page as the template
$pdf->useTemplate($template, 0,0,0);
And I constantly get this error "FPDF error: Template does not exist!".
Can you guys help me out ?
Here is how I have achieved this in a project of mine. Works fine ..
require_once 'pdf/fpdf.php';
require_once 'pdf/fpdi.php';
$pdf = new FPDI();
$pdf->setSourceFile('/path/to/source.pdf');
$pdf->AddPage();
$tplidx = $pdf->ImportPage(1);
$pdf->useTemplate($tplidx, 0, 0, 0);
$output = $pdf->Output('output.pdf', "S");

Convert Multip Page PDF in to single pages with PHP, Imagick ghost script

i have a pdf upload script with php, my question is when user uploads a multipage pdf file , i want this to split in to individual pdf's. for instance if the pdf has 3 pages, the result should be 1.pdf , 2.pdf, 3.pdf etc.
for example
convert -density 300 filename.pdf filename.png works fine creating a png file , but i want the same in to pdf files.
You can use a FPDF and FPDI to do this.
require_once('fpdf/fpdf.php');
require_once('fpdi/fpdi.php');
// get the page count
$pdf = new FPDI();
$pageCount = $pdf->setSourceFile($pdfFilePath);
// iterate through all pages
for($pageNumber = 1; $pageNumber <= $pageCount; $pageNumber++)
{
// create blank document
$pdf = new FPDI();
// import a page
$pdf->setSourceFile($pdfFilePath);
$templateId = $pdf->importPage($pageNumber);
// get the size of the imported page
$size = $pdf->getTemplateSize($templateId);
// create a page (landscape or portrait depending on the page being imported)
if($size['w'] > $size['h'])
{
$pdf->AddPage('L', array($size['w'], $size['h']));
}
else
{ $pdf->AddPage('P', array($size['w'], $size['h']));
}
// use the imported page
$pdf->useTemplate($templateId);
// write the PDF file
$pdf->Output(('/path/to/save/'.$pageNumber.'pdf'), 'F');
}

Categories