それぞれ PDF_add_table_cell() のオプションである fittextline、fittextflow、image オプションに値やハンドルを渡すことで、セル内に配置することができます。
/*
* Mixed table contents:
* Demonstrate how to place various kinds of contents in table cells spanning
* one or more columns or rows
*
* Create a table with various kinds of contents.
* Place a text line spanning several columns and colorize the background of the
* cell.
* Place a text line and a Textflow in two neighbour cells of the same row and
* vertically align them so that they have the same distance from the left and
* upper cell borders.
* Place an image in a cell spanning several rows and place a text line on top
* of it in the same cell.
*
* Required software: PDFlib/PDFlib+PDI/PPS 9
* Required data: image file
*/
package com.pdflib.cookbook.pdflib.table;
import com.pdflib.pdflib;
import com.pdflib.PDFlibException;
public class mixed_table_contents
{
public static void main (String argv[])
{
/* This is where the data files are. Adjust as necessary. */
String searchpath = "../input";
String outfile = "mixed_table_contents.pdf";
String title = "Mixed Table Contents";
pdflib p = null;
int normalfont, boldfont, image, tf=-1, tbl=-1;
String tftext, result, optlist;
String imagefile = "kraxi_logo.tif";
int exitcode = 0;
/* Width of the first, second, and third column of the table */
final int c1 = 50, c2 = 120, c3 = 90;
/* Coordinates of the lower left and upper right corners of the table
* fitbox. The width of the fitbox matches the sum of the widths of the
* three table columns.
*/
final double llx = 100, lly = 500, urx = 360, ury = 600;
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, "") == -1)
throw new Exception("Error: " + p.get_errmsg());
p.set_info("Creator", "PDFlib Cookbook");
p.set_info("Title", title);
/* Load the font */
boldfont = p.load_font("Helvetica-Bold", "unicode", "");
if (boldfont == -1)
throw new Exception("Error: " + p.get_errmsg());
normalfont = p.load_font("Helvetica", "unicode", "");
if (normalfont == -1)
throw new Exception("Error: " + p.get_errmsg());
p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
/* ---------------------
* Adding the first cell
* ---------------------
*
* The cell will be placed in the first column of the first row and will
* span three columns.
* The first column has a width of 50 points.
* The text line is centered vertically and horizontally, with a margin
* of 4 points from all borders.
*/
optlist = "fittextline={font=" + boldfont + " fontsize=12" +
" position=center} margin=4 colspan=3 colwidth=" + c1;
tbl = p.add_table_cell(tbl, 1, 1, "Our Paper Plane Models", optlist);
if (tbl == -1)
throw new Exception("Error: " + p.get_errmsg());
/* -------------------------------------------
* Adding the second cell spanning two columns
* -------------------------------------------
*
* The cell is placed in the first column of the second row and spans
* two columns.
* The first column has a width of 50 points.
* The row height is 14 points.
* The text line is horizontally positioned on the left and vertically
* centered, with a margin of 4 points from all borders.
* Since we want to vertically align text lines and a Textflow we would
* like to have an exact font size of 8 but using the option
* "fontsize=8" does not exactly represent the letter height but adds
* some space below and above. However, the height of an uppercase
* letter is exactly represented by the capheight value of the font. For
* this reason use "fontsize={capheight=6}" which will approximately
* result in a font size of 8 points and (along with "margin=4"), will
* sum up to an overall height of 14 points corresponding to the
* "rowheight" option.
* Since the cell doesn't cover a complete row but only two of
* three columns it cannot be filled with color using on of the
* row-based shading options. We apply the Matchbox feature instead to
* fill the rectangle covered by the cell with a gray background color.
*/
optlist = "fittextline={position={left top} font=" + boldfont +
" fontsize={capheight=6}} rowheight=14 colwidth=" + c1 +
" margin=4 colspan=2 matchbox={fillcolor={gray .92}}";
tbl = p.add_table_cell(tbl, 1, 2, "1 Giant Wing", optlist);
if (tbl == -1)
throw new Exception("Error: " + p.get_errmsg());
/* ---------------------------------
* Adding three more text line cells
* ---------------------------------
*
* Add two more text lines in the first column of the third row as well
* as in the first column of the fourth row. For a description of the
* options see above,
*/
optlist = "fittextline={position={left top} font=" + normalfont +
" fontsize={capheight=6}} rowheight=14 colwidth=" + c1 +
" margin=4";
tbl = p.add_table_cell(tbl, 1, 3, "Material", optlist);
if (tbl == -1)
throw new Exception("Error: " + p.get_errmsg());
tbl = p.add_table_cell(tbl, 1, 4, "Benefit", optlist);
if (tbl == -1)
throw new Exception("Error: " + p.get_errmsg());
/* Add another text line in the second column of the third row with a
* column width of 120. For a description of the options see above.
*/
optlist = "fittextline={position={left top} font=" + normalfont +
" fontsize={capheight=6}} rowheight=14 colwidth=" + c2 +
" margin=4";
tbl = p.add_table_cell(tbl, 2, 3, "Offset print paper 220g/sqm",
optlist);
if (tbl == -1)
throw new Exception("Error: " + p.get_errmsg());
/* ------------------------
* Adding the Textflow cell
* ------------------------
*
*/
tftext =
"It is amazingly robust and can even do aerobatics. " +
"But it is best suited to gliding.";
/* Prepare the option list for adding the Textflow
*
* Use "fontsize={capheight=6}" which will approximately result in a
* font size of 8 points and (along with "margin=4"), will sum up to an
* overall height of 14 points as for the text lines above.
*/
optlist = "font=" + normalfont + " fontsize={capheight=6} leading=110%";
/* Add the Textflow to be placed in a table cell later */
tf = p.add_textflow(-1, tftext, optlist);
if (tf == -1)
throw new Exception("Error: " + p.get_errmsg());
/* Prepare the option list for adding the Textflow table cell
*
* The first line of the Textflow should be aligned with the baseline of
* the "Benefit" text line. At the same time, the "Benefit" text should
* have the same distance from the top cell border as the "Material"
* text. To avoid any space from the top add the Textflow cell using
* "fittextflow={firstlinedist=capheight}". Then add a margin of 4
* points, the same as for the text lines.
*/
optlist = "textflow=" + tf + " fittextflow={firstlinedist=capheight} " +
"colwidth=" + c2 + " margin=4";
tbl = p.add_table_cell(tbl, 2, 4, "", optlist);
if (tbl == -1)
throw new Exception("Error: " + p.get_errmsg());
/* -----------------------------------
* Add the image cell with a text line
* -----------------------------------
*
* The image is placed in a cell starting in the third column of the
* second row and spans three rows.
* The column width is 90 points. The cell margins are set to 4 points.
*/
image = p.load_image("auto", imagefile, "");
if (image == -1)
throw new Exception("Error: " + p.get_errmsg());
optlist = "fittextline={font=" + boldfont + " fontsize=9} image=" +
image + " colwidth=" + c3 + " rowspan=3 margin=4";
tbl = p.add_table_cell(tbl, 3, 2, "Amazingly robust!", optlist);
if (tbl == -1)
throw new Exception("Error: " + p.get_errmsg());
/* -------------
* Fit the table
* -------------
*
* Using "header=1" the table header will include the first line.
* The "fill" option and the suboptions "area=header" and
* "fillcolor={rgb 0.8 0.8 0.87}" specify the header row(s) to be filled
* with the supplied color.
* The "stroke" option and the suboptions "line=frame linewidth=0.8"
* define the ruling of the table frame with a line width of 0.8.
* Using "line=other linewidth=0.3" the ruling of all cells is specified
* with a line width of 0.3.
*/
optlist = "header=1 fill={{area=header fillcolor={rgb 0.8 0.8 0.87}}}" +
" stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}";
result = p.fit_table(tbl, llx, lly, urx, ury, optlist);
/* Check the result; "_stop" means all is ok */
if (!result.equals("_stop")) {
if (result.equals( "_error"))
throw new Exception("Error: " + p.get_errmsg());
else {
/* Other return values require dedicated code to deal with */
}
}
p.end_page_ext("");
p.end_document("");
} catch (PDFlibException e) {
System.err.println("PDFlib exception occurred:");
exitcode = 1;
} catch (Exception e) {
System.err.println(e);
exitcode = 1;
} finally {
if (p != null) {
p.delete();
}
System.exit(exitcode);
}
}
}