Tuesday, August 16, 2011

PDFlib & PHP - (9) Formatting - Wrap Image

Yo! I need to wrap an image w/ text. Here is how it is done in PHP with PDFlib. Get your own, bigger chunk o' lorem if you want. It was five paragraphs of lorem ipsum, but it was an ugly paste, so I cut a few out. Also, the image is from the web and may not be at that address one day.


Using Matchbox optlist of optlist of... to Wrap Image



# wrap image with text using the "usematchbox" option
# of fit_image() - [available in Java only @Cookbook].
$file_name = "blog_9.pdf";
# number reflect an A4 sized document.
$doc_width = 595;
$doc_height = 842;
#
$chunk_o_lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam condimentum suscipit arcu in pharetra. Pellentesque ac purus diam. Proin in orci in diam auctor laoreet. Quisque vel mauris urna, ut aliquet nunc. Nullam diam justo, semper in suscipit vitae, rutrum quis ligula. Proin nec lectus purus. Praesent ut consectetur elit. In a nulla vel orci pretium vehicula at quis dui.

Integer consectetur faucibus hendrerit. Ut ac ante arcu, a fringilla orci. Donec vel sapien enim, a facilisis ipsum. Sed malesuada adipiscing eros a porta. Sed luctus elit id urna faucibus quis mollis risus commodo. Mauris sodales diam vitae mi vulputate placerat. Sed sodales nisi quis orci volutpat sit amet gravida lectus congue. In nec sapien ut mi sodales eleifend. Suspendisse ipsum diam, auctor id consequat sed, rutrum suscipit lacus. Vivamus diam nisi, fringilla nec pharetra id, commodo vel nunc. Quisque aliquam porttitor mi id blandit. Vestibulum et iaculis risus. Suspendisse consectetur, eros quis blandit varius, purus purus venenatis mauris, eu ultrices tortor justo at magna. Vestibulum nulla orci, tincidunt a varius at, dictum sit amet ante. Vestibulum ac lectus ante, ac fermentum erat. Donec nec ante quis neque lacinia viverra id quis tellus.

Nunc et sapien in lacus ultrices mollis. Maecenas pharetra magna lobortis nulla euismod sit amet consequat odio dictum. Donec euismod lorem diam. Ut rutrum urna pharetra lacus hendrerit vestibulum. Vivamus fermentum nunc sed nunc accumsan condimentum ac sit amet ante. Cras quis tortor vitae dolor scelerisque commodo. Aliquam quis diam nibh, a consectetur ante.

Duis ultrices, felis et placerat placerat, dui risus lobortis enim, quis commodo turpis massa sed diam. Curabitur rutrum sapien ac tortor ultricies commodo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin eu dolor lacus. Duis placerat, velit nec rhoncus volutpat, eros purus auctor diam, non eleifend velit tortor nec nunc. Cras consectetur eleifend massa nec tempor. Aenean euismod sem quis mauris ultrices feugiat. Sed ultrices tincidunt tincidunt. Pellentesque velit dolor, tristique a varius non, ultrices non nisi. Fusce adipiscing purus arcu, ac sollicitudin ipsum.";
#
try{
$p = new PDFlib();
$p->set_parameter("logging", "filename {PDFlib.log}");
$p->set_parameter("errorpolicy", "exception");
# set textformat
$p->set_parameter("textformat", "utf8");
#
$optlist = "";
if ($p->begin_document("", $optlist) == 0)
throw new Exception("Error@begin_document: " . $p->get_errmsg());
# add some meta data on file
$p->set_info("Creator", "Neil Lindberg");
$p->set_info("Title", "SVM User Guide (2.1)");
# loading font (that most will have)
$font = $p->load_font("Helvetica", "unicode", "");
$p->begin_page_ext($doc_width, $doc_height, "");
if ($p->setfont($font, 24) == 0)
throw new Exception("Error@setfont: " . $p->get_errmsg());
# random pic, big enough to show wrapping...
$an_otter_pic = "http://carinbondar.com/wp-content/uploads/2010/11/seaotter2.jpg";
$image_data = file_get_contents($an_otter_pic);
$p->create_pvf("/pvf/image", $image_data, "");
$image = $p->load_image("auto", "/pvf/image", "");
if($image == 0) die("Failed at load_image");
$p->delete_pvf("/pvf/image");
$image_width = $p->get_value("imagewidth", $image);
$image_height = $p->get_value("imageheight", $image);
$matchbox_name = "_image_matchbox";
#
# THERE IS NO create_matchbox. It is always created as
# a part of the optlist, for various elements, but does
# have its own string optlist - see API section 6.2.
#
# here, because i have the width and height of image
# i will just use that for boxsize and fitmethod auto, at 40%
$fit_image_opts = "matchbox={name=$matchbox_name margin=-7 } ".
"boxsize={".($image_width*.4)." ".($image_height*.4)."} fitmethod=auto showborder=true";
# the auto fitmethod may not serve your wants
# there are several in the API reference
# fitmethod=clip position={left center}";
$p->fit_image($image, $doc_width*.5-100, 600, $fit_image_opts);
$p->close_image($image);
# now, wrap the text(_flow)!
$tf = $p->add_textflow(0, $chunk_o_lorem, "fontname=Helvetica fontsize=10.5 encoding=unicode");
$result = $p->fit_textflow($tf, 50, 50, 550, 800,
"verticalalign=justify linespreadlimit=150% ".
"wrap={usematchboxes={{$matchbox_name}}}");
$p->end_page_ext("");
#
$p->end_document("");
# get and send buffer
$buf = $p->get_buffer();
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=$file_name");
print $buf;
} catch (PDFlibException $e) {
die("PDFlib exception occurred:\n".
"[" . $e->get_errnum() . "] " . $e->get_apiname() .
": " . $e->get_errmsg() . "\n");
} catch (Exception $e) {
die($e->getMessage());
}

No comments:

Post a Comment