Anonymous
Попытка нарисовать рамку вокруг флажка и отобразить текст с помощью pdfbox
Сообщение
Anonymous » 23 дек 2024, 13:40
Пытаюсь создать заполняемую форму PDF с использованием Java 8 и pdfbox 2.0.30.
Для каждого наполнителя мне нужен флажок с рамкой, нарисованной вокруг него и наполнителя. Кажется довольно простым.
Код выполняется, и при просмотре полученного файла toppingsForm.pdf в браузере отображаются
флажки с нарисованными полями. вокруг них, но без начинки
ИЛИ
флажки с начинкой, но без рамки вокруг флажка
Код: Выделить всё
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();
}
}
}
Я впервые использую pdfBox для создания форм и обычно заполняю их.
Возможно, я столкнулся с какой-то тонкой проблемой с размером/перекрытием. Или вообще лучший способ, например, установить видимую рамку на самом флажке.
TIA,
Все еще учусь, Стив
Подробнее здесь:
https://stackoverflow.com/questions/793 ... ing-pdfbox
1734950444
Anonymous
Пытаюсь создать заполняемую форму PDF с использованием Java 8 и pdfbox 2.0.30. Для каждого наполнителя мне нужен флажок с рамкой, нарисованной вокруг него и наполнителя. Кажется довольно простым. Код выполняется, и при просмотре полученного файла toppingsForm.pdf в браузере отображаются [list] [*]флажки с нарисованными полями. вокруг них, но без начинки ИЛИ [*]флажки с начинкой, но без рамки вокруг флажка [/list] [code] 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(); } } } [/code] Я впервые использую pdfBox для создания форм и обычно заполняю их. Возможно, я столкнулся с какой-то тонкой проблемой с размером/перекрытием. Или вообще лучший способ, например, установить видимую рамку на самом флажке. TIA, Все еще учусь, Стив Подробнее здесь: [url]https://stackoverflow.com/questions/79302498/trying-to-draw-box-around-checkbox-and-display-text-using-pdfbox[/url]