textflow/dot_leaders_with_tabs
Use leaders to fill the space defined by tabs between left-aligned and right-aligned text, such as in a table of contents.
Download PHP Code Switch to Java Code Show Output
<?php
/*
* Dot leaders with tabs:
* Use leaders to fill the space defined by tabs between left-aligned and
* right-aligned text, such as in a table of contents.
*
* Place a Textflow representing a table of contents. In each line, the table
* of contents contains tabs between the text entry and the corresponding
* page number. The space defined by the tab will be filled with the
* characters specified as leaders.
*
* Required software: PDFlib/PDFlib+PDI/PPS 10
* Required data: none
*/
/* This is where the data files are. Adjust as necessary. */
$searchpath = dirname(__FILE__,3)."/input";
$outfile = "";
$title = "Dot Leaders with Tabs";
$tf = 0;
/* Option list for placing the Textflow:
* "ruler=100%" defines a tab position of 100% of the width, e.g. at
* the right border of the text box.
* "hortabmethod=ruler" specifies to use the tab positions defined
* with "ruler".
* "tabalignment=right" defines the tabs to be right-aligned.
* We use the default leader character ".". To specify another
* character(s), use the "text" suboption of the leader option, e.g.
* "leader={text={+ }}" for defining the sequence "+ " as leaders.
*/
$optlist = "fontname=NotoSerif-Regular fontsize=12 " .
"leading=160% ruler=100% hortabmethod=ruler tabalignment=right";
$text =
"<alignment=left>Introduction<leader={alignment={grid}}>" .
"\t7<nextline>" .
"<alignment=left>Chapter 1<leader={alignment={grid}}>" .
"\t25<nextline>" .
"<alignment=left>Chapter 2<leader={alignment={grid}}>" .
"\t107<nextline>" .
"<alignment=left>Chapter 3<leader={alignment={grid}}>" .
"\t219<nextline>" .
"<alignment=left>Appendix<leader={alignment={grid}}>\t240";
try {
$p = new pdflib();
$p->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);
/* Create a Textflow */
$tf = $p->create_textflow($text, $optlist);
if ($tf == 0)
throw new Exception("Error: " . $p->get_errmsg());
/* Loop until all of the text is placed; create new pages
* as long as more text needs to be placed.
*/
do {
$p->begin_page_ext(0, 0, "width=a4.width height=a4.height");
/* Place a text line with a title */
$p->fit_textline("Table of Contents", 50, 740,
"fontname=NotoSerif-Bold fontsize=18");
/* Place the Textflow with the table of contents */
$result = $p->fit_textflow($tf, 50, 600, 500, 700, "");
$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=dot_leaders_with_tabs.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;
?>