set_option("searchpath={" . $searchpath . "}"); /* This means we must check return values of load_font() etc. */ $p->set_option("errorpolicy=return"); if ($p->begin_document($outfile, "") == 0) throw new Exception("Error: " . $p->get_errmsg()); $p->set_info("Creator", "PDFlib Cookbook"); $p->set_info("Title", $title ); /* Option list for the output of the initial drop character defining * the two macros "cap_start" and "cap_end" for starting and ending the * drop ca$p-> * The "matchbox" and "matchbox end" inline options indicate the * rectangle of the character's fitbox. The "textrise" option with an * appropriate negative value will drop the character some lines down. * The "createwrapbox" option indicates that the matchbox will be * inserted as wrap box for further text to wrap around. */ $optlist = "fontname=NotoSerif-Regular alignment=justify " . "charref " . "macro " . "{cap_start {fontsize=" . $c_fontsize . " leading=" . $t_leading . " textrise=" . $c_textrise . " matchbox={createwrapbox boxheight={leading textrise}}} " . "cap_end {matchbox=end fontsize=" . $t_fontsize . " textrise=0}}"; /* Text to be placed on the page. Soft hyphens are marked with the * character reference "­" (character references are enabled by the * "charref" option). */ $text = "<&cap_start>O<&cap_end>ur Paper Planes are the ideal way of " . "passing the time. We offer revolutionary " . "new develop­ments of the traditional com­mon " . "paper planes. If your lesson, conference, or lecture " . "turn out to be deadly boring, you can have a wonderful time " . "with our planes. All our models are fol­ded from one paper " . "sheet. They are exclu­sively folded with­out using any " . "adhesive. Several models are equipped with a folded landing " . "gear enabling a safe landing on the intended loca­tion " . "provided that you have aimed well. Other models are able to fly " . "loops or cover long distances. Let them start from a vista " . "point in the mountains and see where they touch the ground. "; /* Create the Textflow using the optlist defined above */ $tf = $p->create_textflow($text, $optlist); if ($tf == 0) throw new Exception("Error: " . $p->get_errmsg()); do { $p->begin_page_ext(0, 0, "width=a4.width height=a4.height"); /* Fit the Textflow. It will wrap around the matchbox defined for the * initial drop ca$p-> */ $result = $p->fit_textflow($tf, $llx, $lly, $urx, $ury, ""); $p->end_page_ext(""); /* "_boxfull" means we must continue because there is more text; * "_nextpage" is interpreted as "start new column" */ } while ($result == "_boxfull" || $result == "_nextpage"); /* Check for errors */ if (!$result == "_stop") { /* "_boxempty" happens if the box is very small and doesn't * hold any text at all. */ if ($result == "_boxempty") throw new Exception ("Error: Textflow box too small"); else { /* Any other return value is a user exit caused by * the "return" option; this requires dedicated code to * deal with. */ throw new Exception ("User return '" . $result . "' found in Textflow"); } } $p->delete_textflow($tf); $p->end_document(""); $buf = $p->get_buffer(); $len = strlen($buf); header("Content-type: application/pdf"); header("Content-Length: $len"); header("Content-Disposition: inline; filename=drop_caps.pdf"); print $buf; } catch (PDFlibException $e) { echo("PDFlib exception occurred:\n". "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " . $e->get_errmsg() . "\n"); exit(1); } catch (Throwable $e) { echo("PHP exception occurred: " . $e->getMessage() . "\n"); exit(1); } $p = 0; ?>