Ich versuche, ein Kästchen um das Kontrollkästchen zu zeichnen und Text mithilfe der PDF-Box anzuzeigenJava

Java-Forum
Anonymous
 Ich versuche, ein Kästchen um das Kontrollkästchen zu zeichnen und Text mithilfe der PDF-Box anzuzeigen

Post by Anonymous »

Ich versuche, mit Java 8 und pdfbox 2.0.30 ein ausfüllbares PDF-Formular zu erstellen.
Für jeden Belag möchte ich ein Kontrollkästchen mit einem Kästchen darum herum und den Belag. Scheint ziemlich einfach zu sein.
Der Code wird ausgeführt und die Anzeige der resultierenden toppingsForm.pdf in einem Browser zeigt
  • Kontrollkästchen mit gezeichneten Kästchen um sie herum, aber ohne Belag
    ODER
  • Kontrollkästchen mit Belag, aber ohne Kästchen um das Kontrollkästchen herum
import java.io.*;
import java.util.*;
import java.awt.Color;
import java.awt.geom.Rectangle2D;

import org.apache.pdfbox.*;
import org.apache.pdfbox.util.*;
import org.apache.pdfbox.cos.*;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.color.PDColor;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import org.apache.pdfbox.pdmodel.interactive.*;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceCharacteristicsDictionary;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceEntry;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary;
import org.apache.pdfbox.pdmodel.interactive.form.*;
import org.apache.pdfbox.text.*;
import org.apache.pdfbox.contentstream.*;
import org.apache.pdfbox.pdfparser.*;
import org.apache.pdfbox.io.*;

public class Toppings {

private static float getLineWidth( PDAnnotationWidget widget) {

PDBorderStyleDictionary bs = widget.getBorderStyle();
if( bs != null) {
return bs.getWidth();
}
return 1;
}

private static void drawRect( PDDocument document, PDPage page, PDRectangle rect) {
try {
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);

float ll_x = rect.getLowerLeftX();
float ll_y = rect.getLowerLeftY();
float height = rect.getHeight();
float length = rect.getWidth();

contentStream.addRect( ll_x, ll_y, height, length);
contentStream.setLineWidth(1);
contentStream.setNonStrokingColor(Color.WHITE);
contentStream.setStrokingColor(Color.BLACK);
contentStream.stroke();
contentStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

// Generate Form Labels
private static void addText( PDDocument document, PDPage page, String myText, float x, float y, boolean bold) {

try {
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA, 6);
if( bold) {
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 6);
}
contentStream.newLineAtOffset(x, y);
contentStream.showText(myText);
contentStream.endText();
contentStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

private static void addCheckbox( PDDocument pdfDoc, PDAcroForm acroForm, PDPage page, String name, float x, float y) {

try {
PDCheckBox checkbox = new PDCheckBox(acroForm);
checkbox.setPartialName( name);

PDAppearanceCharacteristicsDictionary appearanceCharacteristics = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
appearanceCharacteristics.setBorderColour(new PDColor(new float[] { 1, 0, 0 }, PDDeviceRGB.INSTANCE));
appearanceCharacteristics.setBackground( new PDColor(new float[]{0, 1, 0.3f}, PDDeviceRGB.INSTANCE));
appearanceCharacteristics.setNormalCaption("4");

PDBorderStyleDictionary borderStyleDictionary = new PDBorderStyleDictionary();
borderStyleDictionary.setWidth(1);
borderStyleDictionary.setStyle(PDBorderStyleDictionary.STYLE_SOLID);

PDAnnotationWidget widget = new PDAnnotationWidget();
widget.setRectangle( new PDRectangle( x, y, 16, 16) );
drawRect( pdfDoc, page, widget.getRectangle()); // comment out this line and toppings appear
widget.setAnnotationFlags(4);
widget.setBorderStyle(borderStyleDictionary);
widget.setPage( page);
widget.setParent( checkbox);

List
widgets = new ArrayList();
widgets.add(widget);
page.getAnnotations().add(widget);
checkbox.setWidgets(widgets);

acroForm.getFields().add(checkbox);

addText( pdfDoc, page, name, x + 20, y + 6, false); // comment out this line and checkbox outlines appear

} catch (IOException e) {
e.printStackTrace();
}
}

private static void addToppings( PDDocument pdfDoc, PDAcroForm acroForm, PDPage page, float x, float y) throws IOException {

List options = Arrays.asList("pepperoni","sausage","ham"
,"chicken","canadian bacon","mushrooms"
,"pineapple","onions","green pepper"
,"red pepper","black olives","green olives");

for( int i = 0; i < 12; i++ ) {
addCheckbox( pdfDoc, acroForm, page, options.get(i), x, y);
y = y - 20;
}
}

public static void main(String[] args) {
try {
PDDocument pdfDoc = new PDDocument(); // outfile
PDPage page = new PDPage();
pdfDoc.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream( pdfDoc, page);
PDAcroForm acroForm = new PDAcroForm( pdfDoc);

float x = 20;
float y = 500;
addToppings( pdfDoc, acroForm, page, x, y);

contentStream.close();
pdfDoc.save("C:/Users/MainUser/toppingsForm.pdf");
pdfDoc.close();
} catch ( IOException e) {
e.getMessage();
}
}

}

Ich verwende pdfBox zum ersten Mal zum Erstellen von Formularen und fülle sie normalerweise aus.
Vielleicht stoße ich auf ein subtiles Größen-/Überlappungsproblem. Oder eine insgesamt bessere Möglichkeit, zum Beispiel einen sichtbaren Rahmen auf dem Kontrollkästchen selbst festzulegen.
TIA,
Still-learning Steve

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post