package de.jos.labelgenerator.pdf; import java.io.File; import java.io.FileOutputStream; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.lang.StringUtils; import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfWriter; import de.jos.labelgenerator.components.button.ButtonLabel; import de.jos.labelgenerator.configuration.Layout; import de.jos.labelgenerator.utils.FontUtil; public class PDFGeneratorIText implements PDFGenerator { private static final Logger logger = Logger.getLogger(PDFGenerator.class.getName()); private File targetFile; public PDFGeneratorIText(final File targetFile) { this.targetFile = targetFile; } public boolean generate(Layout layout, List<ButtonLabel> buttonLabelList, boolean drawGrid) { boolean result = false; // check if the given font is supported at all if (FontUtil.isFontSupported(layout.getFontName()) == false) { logger.log(Level.SEVERE, "Font {0} of selected Layout is not supported. The following fonts are supported {1}.", new Object[] { layout.getFontName(), FontUtil.getSupportedFonts().toString() }); return result; } try { logger.log(Level.INFO, "Creating tmp PDF file in directory {0}", targetFile.getAbsolutePath()); final Document document = new Document(PageSize.A4); final PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(targetFile)); document.open(); final PdfContentByte cb = writer.getDirectContent(); final BaseFont font = BaseFont.createFont(layout.getFontName(), "UTF-8", false); int index = 0; for (int row = 0; row < layout.getRows(); row++) { for (int col = layout.getColumns() - 1; col >= 0; col--) { final ButtonLabel buttonLabel = buttonLabelList.get(buttonLabelList.size() - index - 1); String text = buttonLabel.getRenderedTemplate(); logger.log(Level.SEVERE, "Text {0} : {1} ", new Object[] { Integer.valueOf(index), buttonLabel.getRenderedTemplate() }); final int x = mmToPoints(layout.getMarginLeft() + col * layout.getWidthNext()); final int y = mmToPoints(layout.getMarginTop() + row * layout.getHeightNext()); final int width = mmToPoints(layout.getWidth()); final int height = mmToPoints(layout.getHeight()); final Rectangle r = getRectangle(x, y, width, height); // draw grid only when enabled! if (drawGrid == true) { cb.rectangle(r.getLeft(), r.getTop(), r.getWidth(), r.getHeight()); cb.stroke(); // do print the index number when no text is defined if (StringUtils.trimToNull(text) == null) { text = buttonLabel.getIndex().toString(); } } final String[] lines = StringUtils.split(text, "\n"); System.out.println(layout.getTextMarginTop()); int offset = 0; if (lines != null && lines.length > 0) { for (String tmpLine : lines) { cb.beginText(); cb.setFontAndSize(font, layout.getFontSize()); cb.showTextAligned(PdfContentByte.ALIGN_LEFT, StringUtils.trim(tmpLine), x + mmToPoints(layout.getTextMarginLeft().floatValue()), y + height - (offset * (layout.getFontSize().floatValue() + layout.getTextMargin() .floatValue())) - mmToPoints(layout.getTextMarginTop().floatValue()), 0); cb.endText(); offset++; } } index++; } } document.close(); result = true; } catch (Exception e) { logger.log(Level.SEVERE, "Exception occured creating PDF file.", e); e.printStackTrace(); } return result; } private Rectangle getRectangle(int x, int y, int width, int height) { Rectangle r = new Rectangle(x, PageSize.A4.getHeight() - y + height, x + width, PageSize.A4.getHeight() - y); return r; } private int mmToPoints(double mm) { return (int) (72 * mm / 25.4); } private double pointsToMm(double points) { return (double) (points * 25.4 / 72.0); } }