org.xhtmlrenderer.pdf.TextFormField.java Source code

Java tutorial

Introduction

Here is the source code for org.xhtmlrenderer.pdf.TextFormField.java

Source

/*
 * {{{ header & license
 * Copyright (c) 2007 Wisconsin Court System
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 * }}}
 */
package org.xhtmlrenderer.pdf;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.*;
import org.w3c.dom.Element;
import org.xhtmlrenderer.css.parser.FSColor;
import org.xhtmlrenderer.layout.LayoutContext;
import org.xhtmlrenderer.render.BlockBox;
import org.xhtmlrenderer.render.RenderingContext;
import org.xhtmlrenderer.util.*;

import com.lowagie.text.Rectangle;

import java.io.IOException;

public class TextFormField extends AbstractFormField {
    private static final String FIELD_TYPE = "Text";

    private static final int DEFAULT_SIZE = 15;

    private int _baseline;

    public TextFormField(LayoutContext c, BlockBox box, int cssWidth, int cssHeight) {
        initDimensions(c, box, cssWidth, cssHeight);

        float fontSize = box.getStyle().getFSFont(c).getSize2D();
        // FIXME: findbugs possible loss of precision, cf. int / (float)2
        _baseline = (int) (getHeight() / 2 + (fontSize * 0.3f));
    }

    protected void initDimensions(LayoutContext c, BlockBox box, int cssWidth, int cssHeight) {
        if (cssWidth != -1) {
            setWidth(cssWidth);
        } else {
            setWidth(c.getTextRenderer().getWidth(c.getFontContext(), box.getStyle().getFSFont(c),
                    spaces(getSize(box.getElement()))));
        }

        if (cssHeight != -1) {
            setHeight(cssHeight);
        } else {
            setHeight((int) (box.getStyle().getLineHeight(c)));
        }
    }

    protected String getFieldType() {
        return FIELD_TYPE;
    }

    public void paint(RenderingContext c, ITextOutputDevice outputDevice, BlockBox box) {

        PdfWriter writer = outputDevice.getWriter();

        Element elem = box.getElement();

        Rectangle targetArea = outputDevice.createLocalTargetArea(c, box);
        TextField field = new TextField(writer, targetArea, getFieldName(outputDevice, elem));

        String value = getValue(elem);
        field.setText(value);

        try {
            PdfFormField formField = field.getTextField();
            createAppearance(c, outputDevice, box, formField, value);
            //TODO add max length back in
            if (isReadOnly(elem)) {
                formField.setFieldFlags(PdfFormField.FF_READ_ONLY);
            }
            writer.addAnnotation(formField);
        } catch (IOException ioe) {
            System.out.println(ioe);
        } catch (DocumentException de) {
            System.out.println(de);
        }

    }

    private void createAppearance(RenderingContext c, ITextOutputDevice outputDevice, BlockBox box,
            PdfFormField field, String value) {
        PdfWriter writer = outputDevice.getWriter();
        ITextFSFont font = (ITextFSFont) box.getStyle().getFSFont(c);

        PdfContentByte cb = writer.getDirectContent();

        float width = outputDevice.getDeviceLength(getWidth());
        float height = outputDevice.getDeviceLength(getHeight());
        float fontSize = outputDevice.getDeviceLength(font.getSize2D());

        PdfAppearance tp = cb.createAppearance(width, height);
        PdfAppearance tp2 = (PdfAppearance) tp.getDuplicate();
        tp2.setFontAndSize(font.getFontDescription().getFont(), fontSize);

        FSColor color = box.getStyle().getColor();
        setFillColor(tp2, color);

        field.setDefaultAppearanceString(tp2);
        tp.beginVariableText();
        tp.saveState();
        tp.beginText();
        tp.setFontAndSize(font.getFontDescription().getFont(), fontSize);
        setFillColor(tp, color);
        tp.setTextMatrix(0, height / 2 - (fontSize * 0.3f));
        tp.showText(value);
        tp.endText();
        tp.restoreState();
        tp.endVariableText();
        field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
    }

    private int getSize(Element elem) {
        String sSize = elem.getAttribute("size");
        if (Util.isNullOrEmpty(sSize)) {
            return DEFAULT_SIZE;
        } else {
            try {
                return Integer.parseInt(sSize.trim());
            } catch (NumberFormatException e) {
                return DEFAULT_SIZE;
            }
        }
    }

    private int getMaxLength(Element elem) {
        String sMaxLen = elem.getAttribute("maxlength");
        if (Util.isNullOrEmpty(sMaxLen)) {
            return 0;
        } else {
            try {
                return Integer.parseInt(sMaxLen.trim());
            } catch (NumberFormatException e) {
                return 0;
            }
        }
    }

    protected String getValue(Element e) {
        String result = e.getAttribute("value");
        if (Util.isNullOrEmpty(result)) {
            return "";
        } else {
            return result;
        }
    }

    public int getBaseline() {
        return _baseline;
    }

    public boolean hasBaseline() {
        return true;
    }
}