Tool for exporting html as pdf - php
I have a html document which marks up a report. I have a button on this page "Export as pdf". However I am not sure how to export html into a pdf..Are there any tools out there that anyone recommends for such a task..
EDIT: In more detail:
I have the following php:
<?php
function connect() {
$dbh = mysql_connect ("localhost", "user", "password") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db("PDS", $dbh);
return $dbh;
}
session_start();
if(isset($_SESSION['username'])){
if(isset($_POST['entryId'])){
//do something
$dbh = connect();
$ide = $_POST['entryId'];
$usertab = $_POST['usertable'];
$answertable = $usertab . "Answers";
$entrytable = $usertab . "Entries";
$query = mysql_query("SELECT e.date, q.questionNumber, q.question, q.sectionId, a.answer FROM $answertable a, Questions q, $entrytable e WHERE a.entryId = '$ide' AND a.questionId = q.questionId AND e.entryId = '$ide' ORDER BY q.questionNumber ASC;") or die("Error: " . mysql_error());
if($query){
//set variables
$sectionOne = array();
$sectionTwo = array();
$sectionThree = array();
$sectionFour = array();
$sectionFive = array();
while($row=mysql_fetch_assoc($query)){
$date = $row['date'];
$section = $row['sectionId'];
switch($section){
case '1':
$sectionOne[] = $row;
break;
case '2':
$sectionTwo[] = $row;
break;
case '3':
$sectionThree[] = $row;
break;
case '4':
$sectionFour[] = $row;
break;
case '5':
$sectionFive[] = $row;
break;
default:
break;
}
}
}else{
//error - sql failed
}
}
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script src = "jQuery.js"></script>
<script>
$(document).ready(function(){
});
</script>
<title>Personal Diary System - Entry Report - <?php echo($date); ?></title>
</head>
<body>
<h1>Entry Report - <?php echo($date); ?></h1>
<div id = "buttons">
Export as PDF
</div>
<h3>Biological Information</h3>
<?php
$i = 0;
foreach($sectionOne as &$value){
if($i == 1 || $i == 3){
$image = "assets/urine".$i.".png";
echo("<br/>");
echo($value['question']." <br/> "."<img src = \"$image\"/>");
echo("<br/>");
}else{
echo($value['question'].' : '.$value['answer']);
}
echo("<br/>");
$i++;
}
?>
<h3>Fatigue and Recovery</h3>
<?php
foreach($sectionTwo as &$value){
echo($value['question'].' : '.$value['answer']);
echo("<br/>");
}
?>
<h3>Illness and Injury</h3>
<?php
foreach($sectionThree as &$value){
echo($value['question'].' : '.$value['answer']);
echo("<br/>");
}
?>
<h3>Training Sessions</h3>
<?php
foreach($sectionFour as &$value){
echo($value['question'].' : '.$value['answer']);
echo("<br/>");
}
?>
<h3>General Feedback</h3>
<?php
if(count($sectionFive)>0){
foreach($sectionFive as &$value){
echo($value['question'].' : '.$value['answer']);
}
}else{
echo("User didn't leave any feedback");
}
echo("<br/>");
?>
</body>
</html>
<?php
}
?>
This displays the following:
So if I'm using fpdf, what is the best way to export the following as a pdf? Should I write a fpdf function in the same php file or is it best to write a separate php file which creates and displays the pdf (which means I would have to post all relevant data to this file)...
Use FPDF library for php
check here
The first and the main base for this file conversion is FPDF library. FPDF is a pure PHP class to generate PDF files on the fly. Let us start the PDF generation with a simple Hello world display.
<?php
require('fpdf.php');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?>
To generate a pdf file, first we need to include library file fpdf.php. Then we need to create an FPDF object using the default constructor FPDF(). This constructor can be passed three values namely page orientation (portrait or landscape), measure unit, and page size (A4, A5, etc.,). By default pages are in A4 portrait and the measure unit is millimeter. It could have been specified explicitly with:
$pdf=new FPDF('P','mm','A4');
It is possible to use landscape (L), other page formats (such as Letter and Legal) and measure units (pt, cm, in).
Then we have added a page to our pdf document with AddPage(). The origin is at the upper-left corner and the current position is by default placed at 1 cm from the borders; the margins can be changed with the function SetMargins().
To print a text, we need to first select a font with SetFont(). Let us select Arial bold 16:
$pdf->SetFont('Arial','B',16);
We use Cell() function to output a text. A cell is a rectangular area, possibly framed, which contains some text. It is output at the current position. We specify its dimensions, its text (centered or aligned), if borders should be drawn, and where the current position moves after it (to the right, below or to the beginning of the next line). To add a frame, we would do this:
$pdf->Cell(40,10,'Hello World !',1);
Finally, the document is closed and sent to the browser with Output(). We could have saved it in a file by passing the desired file name.
I've found this software quite useful: http://code.google.com/p/wkhtmltopdf/
It is true that you'll have to exec() it from your code, but it works very good and uses webkit as the backend engine (allowing javascript also, and many other features to customize the pdf creation), saving a lot of code.
Hope it helps, we're using it here and it works like a charm.
EDIT: try the static binaries. untar and ready to go :)
You may also use an online tool Pdfcrowd API
Its easy to integrate and provides much in its free edition. You may check
PDFCrowd Official Site
require 'pdfcrowd.php';
// create an API client instance
$client = new Pdfcrowd("username", "apikey");
// convert a web page and store the generated PDF into a variable
$pdf = $client->convertURI('http://www.google.com/');
//You can also convert raw HTML code, just use the convertHtml() method instead of convertURI()
$pdf = $client->convertHtml("<body>My HTML Layout</body>");
//Or use convertFile() to convert a local HTML file
$pdf = $client->convertFile("/path/to/MyLayout.html");
// set HTTP response headers
header("Content-Type: application/pdf");
header("Cache-Control: no-cache");
header("Accept-Ranges: none");
header("Content-Disposition: attachment; filename=\"google_com.pdf\"");
// send the generated PDF
echo $pdf;
Another much easier way is with HTML2FPDF.
HTML2FPDF is a PHP Class library that uses the FPDF class library to convert HTML files to PDF files. This library consist of three classes namely PDF, HTML2FPDF and FPDF (modified FPDF class). The class PDF extends the class HTML2FPDF that extends the class FPDF.
Now let us see, how to convert a sample html page into a PDF file using HTML2FPDF Library. The html page contains a table that lists a few nations with their corresponding national flags. Below is the code for the conversion.
<?
require('html2fpdf.php');
$pdf=new HTML2FPDF();
$pdf->AddPage();
$fp = fopen("sample.html","r");
$strContent = fread($fp, filesize("sample.html"));
fclose($fp);
$pdf->WriteHTML($strContent);
$pdf->Output("sample.pdf");
echo "PDF file is generated successfully!";
?>
First, we need to include the html2fpdf.php file that contains the HTML2FPDF class and an object is created using the constructor HTML2FPDF(). Then a new page is added to the pdf document using the function AddPage(). The html contents are read from the sample.html file using file functions. Then the html contents are written in to the pdf format using WriteHTML() function. To view the html file, click here and to view the generated pdf, click here. The above sample code with the sample html file and images and the html2fpdf class libraries can be downloaded here.
The HTML2FPDF class library will be working best with the XHTML 1.0. Also the class does not support all the features available with HTML. To know the supported HTML tags and other features, Please refer http://html2fpdf.sourceforge.net.
I recommend you to use this since it's much easier and friendly.
Related
php barcode - display multiple barcode in single page
I created a php page that print the barcode. Just to view it before i print it on an A4. Still in testing phase. The codes are as below. <?php include('include/conn.php'); include('include/Barcode39.php'); $sql="select * from barcode where b_status = 'NOT-PRINTED'"; $result=mysqli_query($conn,$sql); echo mysqli_num_rows($result); $i=0; while($row=mysqli_fetch_assoc($result)){ $acc_no = $row["b_acc_no_code"]; $bc = new Barcode39($row["b_acc_no_code"]); echo $bc->draw(); $bc->draw($acc_no.$i.".jpg"); echo '<br /><br />'; $i++; } ?> Without the while loop, it can be printed, but only one barcode. How to make it generate, for example in the database have 5 values, it will print 5 barcode in the same page. Thanks in advance
Try to use another bar code source. Because It is generate only one bar code per page. Can't able to create multiple bar code per page.
I know this is an older post but comes up in searches so is probably worth replying to. I have successfully used the Barcode39 to display multiple barcodes. The trick is to get base64 data from the class and then display the barcodes in separate HTML tags. The quickest way to do this is to add a $base64 parameter to the draw() method: public function draw($filename = null, $base64 = false) { Then, near the end of the draw() method, modify to buffer the imagegif() call and return the output in base64: // check if writing image if ($filename) { imagegif($img, $filename); } // NEW: Return base 64 for the barcode image else if ($base64) { ob_start(); imagegif($img); $image_data = ob_get_clean(); imagedestroy($img); return base64_encode($image_data); } // display image else { header("Content-type: image/gif"); imagegif($img); } Finally, to display multiples from the calling procedure, construct the image HTML in the loop and display: // assuming everything else has been set up, end with this... $base64 = $barcode->draw('', true); // Note the second param is set for base64 $html = ''; for ($i = 0; $i < $numBarcodes; $i++) { $html .= '<img src="data:image/gif;base64,'.$base64.'">'; } die('<html><body>' . $html . '</body></html>'); I hope this helps anyone else facing this challenge.
FPDF not writing on all pages
Hi I'm using FPDF and FPDI, I'm using FPDI to concatenate several PDFs then using FPDF to fill in the information based on a form that is filled out, I've setup a SetPage method within FPDF to be able to set the page on which I'm working on, I'm able to write on the first file completely fine (first 3 pages). However, when I'm trying to write on the second file (4th and continuing pages), I use the SetXY and Write but nothing is written, I am able to add an image (barcode at the bottom of the page) but no text, any ideas as to what I'm doing wrong? This is the code that I've got to concatenate the files: <?php session_start(); require_once('lib/pdf/fpdf.php'); require_once('lib/pdi/fpdi.php'); require_once('lib/barcode/class/BCGFontFile.php'); require_once('lib/barcode/class/BCGColor.php'); require_once('lib/barcode/class/BCGDrawing.php'); require_once('lib/barcode/class/BCGcode39extended.barcode.php'); $contractType = $_SESSION['addition']; require_once('barcode.php'); if(isset($contractType)) { $files = array('lib/blank/NDA.pdf'); if($contractType = 'artist') { array_push ($files, 'lib/blank/Distro.pdf', 'lib/blank/Management-Trial.pdf' ); } else { echo "Whoops! Something must've happened when you were filling out your contracts! Please try filling them out again. Sorry!"; } } $pdf = new FPDI(); foreach ($files AS $file) { $pageCount = $pdf->setSourceFile($file); for($n = 1; $n <= $pageCount; $n++) { $tmpIdx = $pdf->importPage($n); $size = $pdf->getTemplateSize($tmpIdx); if($size['w'] > $size['h']) { $pdf->AddPage('L', array($size['w'], $size['h'])); } else { $pdf->AddPage('P', array($size['w'], $size['h'])); } $pdf->useTemplate($tmpIdx); } } //NDA FILLER include('lib/filler/NDA.php'); //Distro Contract Filler include('lib/filler/Distro.php'); //session_unset(); $pdf->Output(); ?> This is the code for filling out the first PDF (which works completely fine): NDA.php <?php //ID No. $idcoded = 'idbars/'.$_SESSION['name'].'.png'; /* for($p = 2; $p <= $pages; $p++) { $pdf->Image($idcoded,0,350); $pdf->setPage($p); } */ $pdf->SetPage(1); $pdf->Image($idcoded,0,350); $pdf->SetFont('Helvetica'); $pdf->SetTextColor(255, 0, 0); //NDA DATE $pdf->SetXY(51, 109.5); $pdf->Write(0, date(d)); $pdf->SetXY(72, 109.5); $pdf->Write(0, date(F)); //Legal Name $pdf->SetXY(72, 114.5); $pdf->Write(0, $_SESSION['name']); //stage Name $pdf->SetXY(80, 119.5); $pdf->Write(0, $_SESSION['sname']); $pdf->setPage(2); $pdf->Image($idcoded,0,350); $pdf->setPage(3); $pdf->Image($idcoded,0,350); $signature = 'idbars/'.$_SESSION['name'].'_sig.png'; $pdf->Image($signature,20,105,100); ?> This is what I'm using to try to write on the second PDF, I've tried combining the NDA.php and Distro.php into one file and that makes no difference Distro.php <?php $pdf->SetPage(4); $pdf->SetXY(10,10); $pdf->Cell(0, $_SESSION['name']); $pdf->Write(0, $_SESSION['name']); $pdf->Image($idcoded,0,350); ?> The page that this is building works off of this form: https://secure.gr8label.com/sign/artist/Dev%20Test/
FPDF "caches" the font information that is currently used. As you jump back to another page FPDF "thinks" that the font is already defined/set but in the PDF file itself it isn't. You should set your font and size in your import loop, to ensure that the font is available on all pages (I think it also could work, by defining it only on the first one). Anyhow you should have seen that jumping between written pages results in problems and you should create a logic which creates the file from top to bottom without using things like "SetPage()" at all.
How do I print a barcode using barcode generator for PHP onto a pdf formatted page where I want it?
Alright so first things first: I've searched over this site for 6+ hours and I keep coming up with the same results. The main answer I keep getting is: How to Generate Barcode using PHP and Display it as an Image on the same page But this is not working for me. Even the answer on that page that was accepted ends with "After you have added all the codes, you will get this way:" which is so vague I feel like I'm supposed to already be an expert to understand it. I'm getting frustrated with this problem because I cannot seem to find any "moron directions" that can help me understand how everything works in this library for barcode generator for php. Here is what I have: I'm using fpdf to print a pdf file which works great! Page Name: PrintMyPDF.php <?php //error_reporting(E_ALL); //ini_set('display_errors', 1); $thisorderID = $_GET['Xort']; require ('UFunctions.php'); if (trim($thisorderID) == ""){ $value = '0'; } if (!is_digit($thisorderID) || $thisorderID < 0) { header('Location:ErrorInt.php'); exit; } //Database connection established require_once('DBASEConnector.php'); $sql2 = "SELECT users.name, users.storenum, users.storename, Orders.OrderID, Orders.name FROM users, Orders WHERE Orders.name = users.name AND Orders.OrderID = '$thisorderID'"; $result = $db->query($sql2); $row = $result->fetch_assoc(); $ThisStoreNum = $row['storenum']; $ThisStoreName = $row['storename']; require('fpdf.php'); $pdf = new FPDF(); //$fpdf->SetMargins(0, 0, 0); //$fpdf->SetAutoPageBreak(true, 0); $pdf->SetAuthor('Walter Ballsbig'); $pdf->SetTitle('Order Form'); $pdf->SetFont('Helvetica','B',16); $pdf->SetTextColor(0,0,0); $pdf->AddPage('P'); $pdf->SetDisplayMode(real,'default'); $pdf->SetXY(50,20); $pdf->SetDrawColor(0,0,0); $pdf->Cell(100,10,'Order Form',1,1,'C',0); $pdf->SetFontSize(10); $pdf->SetX(50); $pdf->Cell(100,10, 'Order: '.$thisorderID.' | Store: '.$ThisStoreNum.'-'.$ThisStoreName,1,1,'C',0); $pdf->SetXY(10,50); $pdf->SetFontSize(12); $pdf->Cell(6,6,'X',1,0,'C',0); $pdf->Cell(14,6,'QTY',1,0,'C',0); $pdf->Cell(130,6, 'ITEM',1,0,'C',0); $pdf->Cell(30,6, 'UNIT',1,1,'C',0); $query = "SELECT Inventory.ProductI, Inventory.ProductName, Inventory.CurrentQty, Inventory.Pull, Inventory.Unit, OrderItems.ProductI, OrderItems.QtyO, OrderItems.OrderI FROM Inventory, OrderItems WHERE OrderItems.OrderI = '$thisorderID' AND OrderItems.ProductI = Inventory.ProductI ORDER BY Inventory.Pull, Inventory.ProductName"; $result = $db->query($query); $num_results = $result->num_rows; for ($i=0; $i <$num_results; $i++) { $row = $result->fetch_assoc(); $pdf->SetFontSize(12); IF ($row['CurrentQty'] <=0) { $pdf->SetFontSize(10); $pdf->Cell(6,6,'BO',1,0,'C',0); $pdf->SetFontSize(12); }else{ $pdf->Cell(6,6,' ',1,0,'C',0); } $pdf->Cell(14,6, $row['QtyO'],1,0,'C',0); $pdf->Cell(130,6, $row['ProductName'],1,0,'L',0); $pdf->Cell(30,6, $row['Unit'],1,1,'C',0); } $pdf->Output(); $db->close(); ?> This prints up my pdf beautifully! Now I wanted to add a barcode on the page that will represent the order number for scanning purposes. Now here is what I have for my code that contains the barcode... code. Name of barcode page: BarCodeIt.php <?php function BarCodeIt($MyID) { // Including all required classes require_once('./class/BCGFontFile.php'); require_once('./class/BCGColor.php'); require_once('./class/BCGDrawing.php'); // Including the barcode technology require_once('./class/BCGcode39.barcode.php'); // Loading Font $font = new BCGFontFile('./font/Arial.ttf', 18); // Don't forget to sanitize user inputs $text = isset($_GET['text']) ? $_GET['text'] : $MyID; // The arguments are R, G, B for color. $color_black = new BCGColor(0, 0, 0); $color_white = new BCGColor(255, 255, 255); $drawException = null; try { $code = new BCGcode39(); $code->setScale(2); // Resolution $code->setThickness(30); // Thickness $code->setForegroundColor($color_black); // Color of bars $code->setBackgroundColor($color_white); // Color of spaces $code->setFont($font); // Font (or 0) $code->parse($text); // Text } catch(Exception $exception) { $drawException = $exception; } /* Here is the list of the arguments 1 - Filename (empty : display on screen) 2 - Background color */ $drawing = new BCGDrawing('', $color_white); if($drawException) { $drawing->drawException($drawException); } else { $drawing->setBarcode($code); $drawing->draw(); } //Header that says it is an image (remove it if you save the barcode to a file) header('Content-Type: image/png'); header('Content-Disposition: inline; filename="barcode.png"'); // Draw (or save) the image into PNG format. $drawing->finish(BCGDrawing::IMG_FORMAT_PNG); } ?> Now in my PDF file just before this line: $pdf->Output(); I have added this: $pdf->AddPage('P'); $pdf->SetDisplayMode(real,'default'); require('/BarCodeIt.php'); $MyBarCode = BarCodeIt($thisorderID); echo $MyBarCode; But what it does is all of my other pdf elements disappear and I'm left with only a big barcode (the right one! that part works) but that's all that is on the screen. It's like when the barcode section runs it negates everything else and just prints the barcode. I want to print just the barcode where I want it on the PDF but I'm not clever enough to figure out what I'm doing wrong. Any help on this would be greatly appreciated.
In $pdf->SetDisplayMode(real,'default');, real is not an identifier. I believe you've forgotten the $ prefix. Have you warnings reporting at maximum level? If not, include: error_reporting(E_ALL); in your script and see that it shows additional issues.
I'm not familiar with fpdf, but what you are doing seems wrong just by looking at it: Everywhere you add elements to your pdf by using methods on your $pdf object like $pdf->... and when you want to add the barcode, you echo it out directly. Don't echo your image out. Instead get rid of the header() calls in your barcode script, save your image and look for the right method to add an image to the $pdf object. Here is a question with answers that deals with adding an image: Inserting an image with PHP and FPDF
PHP link to include header
I have php reading a text file that contains all the names of images in a directory, it then strips the file extension and displays the file name without the .jpg extension as a link to let the user click on then name, what I am looking for is a easy way to have the link that is clicked be transferred to a variable or find a easier solution so the link once it is clicks opens a page that contains the default header and the image they selected without making hundreds of HTML files for each image in the directory. my code is below I am a newbie at PHP so forgive my lack of knowledge. thank you in advance. also I would like a apple device to read this so I want to say away from java script. <html> <head> <title>Pictures</title> </head> <body> <p> <?php // create an array to set page-level variables $page = array(); $page['title'] = ' PHP'; /* once the file is imported, the variables set above will become available to it */ // include the page header include('header.php'); ?> <center> <?php // loads page links $x="0"; // readfile // set file to read $file = '\filelist.txt' or die('Could not open file!'); // read file into array $data = file($file) or die('Could not read file!'); // loop through array and print each line foreach ($data as $line) { $page[$x]=$line; $x++; } $x--; for ($i = 0; $i <= $x; $i++) { $str=strlen($page[$i]); $str=bcsub($str,6); $strr=substr($page[$i],0,$str); $link[$i]= "<a href=".$page[$i]."jpg>".$strr."</a>"; echo "<td>".$link[$i]."<br/"; } ?> </P></center> <?php // include the page footer include('/footer.php'); ?> </body> </html>
add the filename to the url that you want to use as a landing page, and catch it using $_GET to build the link. <a href='landingpage.php?file=<?php echo $filename; ?>'><?php echo $filename; ?></a> Then for the image link on the landing page <img src='path/to/file/<?php echo $_GET['file'] ?>.jpg' />
Iterating through results MongoDB & GridFS (PHP)
I am using GridFS and I have currently got it to display a single image using findOne, although I would like it to iterate through all the results in the grid and echo them all to screen, here is the code I am using: <?php try { // open connection to MongoDB server $conn = new Mongo; // access database $db = $conn->database; // get GridFS files collection $grid = $db->getGridFS(); // retrieve file from collection header('Content-type: image/png'); $file = $grid->findOne(array('_id' => new MongoId('4fb437dbee3c471b1f000001'))); // send headers and file data echo $file->getBytes(); exit; // disconnect from server $conn->close(); } catch (MongoConnectionException $e) { die('Error connecting to MongoDB server'); } catch (MongoException $e) { die('Error: ' . $e->getMessage()); } ?> Thanks
In general, if you're displaying images on a web page, you want to have a bunch of tags like <img src="someUrl" /> and then have each someUrl handle getting a single image.
Use "find" vs "findOne", which will return a result set you can loop through with a foreach, like: $files = $grid->find({}); foreach($files as $file) { echo $file->someData; }
You set the header to image/png so the browser expects only one image. What you could do is change that to a text/html document and embed the images using the data URI scheme (see http://en.wikipedia.org/wiki/Data_URI_scheme ) and then output the images in a series of images tags. <!doctype html> <html> <head> <meta charset="UTF-8"> <title>My images</title> <head> <body> <?php /* ... db connection/init code ... */ $files = $grid->find({}); foreach($files as $file) { $encodedData = base64_encode($file->getBytes()); echo "<img src=\"data:image/png;base64,{$encodedData}\">"; echo "<br>"; } ?> </body> </html> Note that you probably want to detect if the mime type of the image and change accordingly and set alt, width and height attributes using the file's metadata. Hope this helps.