php include generated png in pdf via fpdf - php

I am trying to generate a PDF with an image that is also generated by php.
Sounds simple enough and I am sure I'm just screwing up the header but I can't seem to find a solution here.
first I generate a PDF:
define('FPDF_FONTPATH','fonts/');
require('scpt/fpdf.php');
class PDF extends FPDF {}
$pdf = new FPDF('P','in',array(8.5,11));
$pdf->SetAutoPageBreak(false,0);
$pdf->SetTextColor(0,0,0);
$pdf->SetDrawColor(0,0,0);
$pdf->SetFont('Helvetica','',12);
$pdf->Image('label.php?imgid=17',0,0,0,0,'PNG');
$pdf->Output('label.pdf','D');
then I generate the PNG in label.php:
if(isset($_GET["imgid"])) {
header("Content-Type: image/png");
$im = #imagecreate(110, 20)
or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 0, 0, 0);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "A Simple Text String", $text_color);
imagepng($im);
imagedestroy($im);
}
This will output: FPDF error: Not a PNG file:....
calling label.php?imgid=17 in the browser however will show me the image just fine...
What am I missing?
EDIT
In document:
Example
// Insert a logo in the top-left corner at 300 dpi
$pdf->Image('logo.png',10,10,-300);
// Insert a dynamic image from a URL
$pdf->Image('http://chart.googleapis.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World',60,30,90,0,'PNG');
so it SHOULD be possible to include a dynamically generated image without saving it first?!
EDIT #2
I made it work with the library mem_image but the problem remains that this should not throw an error IMO?! So I leave this question open to see if there is indeed something wrong with my script of this turning out to be a bug.

You almost had it, you're missing only a couple things. First you need the full server address in the URL for your Image() call, so instead of
$pdf->Image('label.php?imgid=17',0,0,0,0,'PNG');
You need:
$pdf->Image('http://www.yourserver.com/label.php?imgid=17',0,0,0,0,'PNG');
That will eliminate the FPDF error you were encountering. Then to get FPDF to render your output correctly, you need to add a call to AddPage(), so your PDF generation script would become:
require('scpt/fpdf.php');
$pdf = new FPDF('P','in',array(8.5,11));
$pdf->AddPage();
$pdf->Image('http://www.yourserver.com/label.php?imgid=17',0,0,0,0,'PNG');
$pdf->Output('label.pdf','D');
Of course you don't need the SetTextColor(), SetFont(), etc if you're only including the single image. You didn't need the custom class definition either (I removed the unneeded lines).
Don't forget to substitute www.yourserver.com for the appropriate domain and path for your script.

The argument to the Image function needs to be a file, not a URL or another script. Since you already have your label script, the easiest work around would be to download the image to a temp location and then call $pdf->Image() with that temporary file.

This problem occurred With your file name,Make sure your passing file name is valid
function _parsepngstream($f, $file)
{
// Check signature
if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
$this->Error('Not a PNG file: '.$file);
...
}

View allow_url_fopen directive
http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen

You need to do only changes that
require('fpdf.php');
and do the
$pdf->Image('http://www.yourserver.com/label.php?imgid=17',0,0,0,0,'PNG');
and run your code...

First, try to check your url with this code
$handle = fopen("http://www.yourserver.com/label.php?imgid=17", "rb");
print_r(fread($handle, 8192));
you with see what the contain in your url
**) make sure your url is not redirect to the login page

much more easy, only put .png in the final of dinamic chain and its all
example:
$pdf->Image('http://www.yourserver.com/label.php? imgid=17.png',0,0,0,0,'PNG');
or
$pdf->Image('../label.php?imgid=17.png',0,0,0,0,'PNG');
the mime type is not recognized in the url why does not appear png, if it's a stupid mistake but it is proven, google does the same by adding the extension with the url & PNG

Related

Echo/Print variables for debugging which GD image seems to hide

I have a site which displays a dynamically generated GD image (data pulled from SQL). I need to view this image to pinpoint inconsistencies in my coding. These aren't errors, but rather just simple variables that are out of place that I must isolate. The easiest way I've found to do this is to simply echo the variables at different points in the code.
The problem is that the GD Image will overlay the page and so nothing is displayed from echo/print. The only way I can call the variables/functions the way I want to is by clicking on unique spots on this image. So the image must be there to echo the correct php variables. Both must be present at the same time. The only way I can echo/print is to turn off the image, but then these variables tell me nothing without being able to look at the image.
I don't want to use breakpoints/debugging etc as I'm on a shared host and don't have access to the extensions required for this, and I don't want to run a server locally for development.
I'm pulling the image in an img src="image.php" tag, and the PHP is stored in an external file called functions.php. The index.html which brings it all together is just jquery/javascript.
How can I echo the outputs with the GD image still displayed?
Output your debugging to the log.
error_log('Your message here...');
http://php.net/manual/en/function.error-log.php
You could buffer the output of the script using ob_start()/ob_get_contents() and then use imagestring to draw those logs on the image like so:
ob_start();
echo("Foo");
$out = ob_get_contents();
imagestring($image, 5, 0, 0, $out, imagecolorallocate($image, 255, 255, 255));
ob_end_clean();

Create/Download an Image using Codeigniter

Sorry to ask this issue as it puzzled me for a long time using Codeigniter.
Here is what I am doing.
As seen below, I am displaying a form where there is a button "Download".
This download button should download that image into PDF file where the details
are written on it (those in RED box).
So this is the process I am doing.
Create an Image on the fly (dynamic) using PHP function imagecreatefromjpeg.
Download/Copy that image generated in the URL and save it in a folder in the server
Generate a PDF using mpdf referencing to that image created dynamically.
I can now create an image dynamically like this one below. Where I can write a text into the image (see 2015 text written in the image)
My problem is, when I click the "Download" button, it should not display
the image in the browser but automatically download it in the folder on the server then it calls the function MPDF to convert it into PDF file. Is this possible?
Code:
This is the Method called when user clicked the "Download" button
public function download_pdf() {
$data['image'] = $this -> get_photo();
$this -> mpdf_convert_pdf();
}
This is the function that creates the image dynamically. Once created, it should download it in the specified folder location on the server.
function get_photo(){
//Create an Image on the Fly
header('Content-Type: image/jpg');
$imgpath = site_url() . 'assets/images/2316.jpg';
$img = #imagecreatefromjpeg($imgpath);
$white = imagecolorallocate($img, 0, 0, 0);
$font_path = 'assets/fonts/arial.ttf';
$text = "2015!";
imagettftext($img, 100, 0, 300, 300, $white, $font_path, $text);
imagejpeg($img);
imagedestroy($img);
//Copy an Image from URL into a server folder
$content = file_get_contents('http://localhost/run_ms/ccertificates/get_photo');
file_put_contents('C:\xampp\htdocs\run_ms\assets\images\thumb\Test.png', $content);
}
And here's is the part where it converts the image into PDF file.
public function mpdf_convert_pdf() {
include ('application/third_party/mpdf/mpdf.php');
$mpdf = new mPDF('c', 'Legal', '', '', 5, 5, 5, '5', '5', '0');
//Display output
$html = '<img src="C:\xampp\htdocs\run_ms\assets\images\thumb\Test.png">';
//display PDF file
$mpdf -> WriteHTML($html);
$mpdf -> Output('Converted_pdf', 'D');
exit ;
}
Thank you so much experts any inputs you may share into this query of mine.
so the point is, in every "Download" button you clicked, the pdf should open to new tab and showing the data first?
In order not to display the created image in the browser, you need to specify the path where it will be saved into your server. Since my issue before is how to download the created image and not to be displayed in the browser.
To do so, you need to specify the path on the fm imagejpeg
So instead of doing like this:
imagejpeg($img);
It should be done this way:
imagejpeg($img,'C:\xampp\htdocs\rn_ms\assets\images\thumb\test.png');
The second parameter is the path and filename where it will be saved in the server as stated in the PHP manual (http://php.net/manual/en/function.imagejpeg.php ). So, if the path was not specified, it will be shown in the browser but if specified, then it will be downloaded as file in the specified server path.
Hopes this will help to other developers. :)

PHP how to output dynamic image

I think this will be an easy answer but I just can't figure it out.
I have a script that generates a pdf using fpdf and fpdi.
If I use a normal image then the pdf generates perfectly but I am trying to use an image generated dynamically by php.
$bc = new PrintBarcode('DARP CODE');
$bc->drawVoucher();
$src = $bc->getVoucher();
// image
$src = $bc->getVoucher();
$pdf->Image($src, 22, 94, 100, 15);
This gives the error:
FPDF error: Image file has no extension and no type was specified: Resource id #16
If I do
$barcode = imagejpeg($src);
$pdf->Image($barcode, 22, 94, 100, 15);
presumably because the imagejpeg is actually outputting the image but the image header is set because if the jpeg header is set the image will display fine so I'm just trying to figure out the correct way of doing this.
If it's easier, I have a separate script which can generate the image, e.g. `printbarcode.php' but I don't know how to get the contents of that script into this function:
$pdf->Image($barcode, 22, 94, 100, 15);
From the error message I would guess that the $pdf->Image() function is expecting $src to be a path to a file. What you are passing seems like a object.
Try saving the image to disk and loading from there. You are almost there with imagejpeg() function - see docs on php.net. Supply a path to save the file
imagejpeg($img, 'myfile.jpg', 90); // 90 denotes high quality
$pdf->Image('myfile.jpg', 22, 94, 100, 15);
...
unlink('myfile.jpg'); // delete after
or alternatively look for a function on the fpdf library that takes image resource as a parameter.
You don't need the image handler PHP uses to manipulate the image. What you need is the actual result of the image manipulation, namely the resulting file. Use imagejpeg($img, '/path/to/some/tmp/dir/file.jpg'); and hand the path over to your $pdf->Image() call. Then after creating the PDF you can safely remove the temporarily stored image, I think.
you have to do like this with the help of php's GD library..
//Create a new image from file or URL
$img_src = imagecreatefromjpeg($src);
// Output the image
imagejpeg($img_src);
// Free up memory
imagedestroy($img_src);

Need help with PHP GD imagesetpixel()

$imageurl = "kaptka.gif";
$im = imagecreatefromgif($imageurl);
$b = imagecolorallocate($im, 0, 0, 0);
imagesetpixel($im, 5, 5, $b);
header('Content-Type: image/gif');
imagegif($im, "asd.gif");
kaptka.gif is normal gif image. I want to draw some pixels anywhere on the image. Asd.gif looks normal, but when i open the file it should show me both like asd.gif, but it shows just "IMAGE" text.
You are calling the function imagegif() with a filename. This will write the image to disc. To display the contents, simply call it without the filename: this will pass the contents to the output stream, which means it will be sent to the client's browser. One way to do both is to call it twice, once to save the file, and once to display it.
When saving the file, you can assign the result to a variable $foo=imagegif($im, 'bar.gif') and then check the result to see if the save was successful. A FALSE means it failed.
You say the image saved to the server is OK, so the reason you are getting an "IMAGE text" in your browser is probably because you are sending a PNG header, but no data (because of the way you called imagefig()).

Adding of Image Layer Fails (GD) PHP

I've installed the GD Library on my Apache just now, and it seems that my script below doesn't work.
I'm trying to add a layer "play.png" to a youtube video thumbnail (http://img.youtube.com/vi/VIDEOID/default.jpg)
I've tried it with many different videoID's but the image doesn't load. There is a message that the graphic couldn't be opened because it contains errors.
I'm opening the file with postimage.php?v=7yV_JtFnIwo
http://img.youtube.com/vi/7yV_JtFnIwo/default.jpg opens correctly too...
Does anyone know where the issue could be?
Thanks in advance!
<?php
// The header line informs the server of what to send the output
// as. In this case, the server will see the output as a .png
// image and send it as such
header ("Content-type: image/png");
// Defining the background image. Optionally, a .jpg image could
// could be used using imagecreatefromjpeg, but I personally
// prefer working with png
$background = imagecreatefromjpeg("http://img.youtube.com/vi/".$_GET['v']."/default.jpg");
// Defining the overlay image to be added or combined.
$insert = imagecreatefrompng("play.png");
// Select the first pixel of the overlay image (at 0,0) and use
// it's color to define the transparent color
imagecolortransparent($insert,imagecolorat($insert,0,0));
// Get overlay image width and hight for later use
$insert_x = imagesx($insert);
$insert_y = imagesy($insert);
// Combine the images into a single output image. Some people
// prefer to use the imagecopy() function, but more often than
// not, it sometimes does not work. (could be a bug)
imagecopymerge($background,$insert,0,0,0,0,$insert_x,$insert_y,100);
// Output the results as a png image, to be sent to viewer's
// browser. The results can be displayed within an HTML document
// as an image tag or background image for the document, tables,
// or anywhere an image URL may be acceptable.
imagepng($background,"",100);
?>
Do not close (avoid whitespaces or newslines) your script with ?> and use NULL instead "".
imagepng($background, NULL);
Then, in imagepng the quality parameter is between 0 and 9, as in http://it.php.net/manual/en/function.imagepng.php.

Categories