Попытка нарисовать рамку вокруг флажка и отобразить текст с помощью pdfboxJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Попытка нарисовать рамку вокруг флажка и отобразить текст с помощью pdfbox

Сообщение Anonymous »

Пытаюсь создать заполняемую форму 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»