作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我创建我的 PDF 时,复选框最初没有出现。单击它 (onBlur) 后,会出现某种可见的阴影,当它聚焦时,它就不再可见了。我怎样才能让它始终可见?以及如何添加某种边框(无需使用矩形类手动添加)?
public class CheckBoxWriter {
public static void main(String[] args) throws IOException {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
// just a rectangle to be able to locate the checkbox
PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, false);
contentStream.addRect(100, 100, 50, 50);
contentStream.setLineWidth(1);
contentStream.setNonStrokingColor(Color.WHITE);
contentStream.setStrokingColor(Color.BLACK);
contentStream.stroke();
contentStream.close();
PDAcroForm acroForm = new PDAcroForm(document);
PDCheckBox checkBox = new PDCheckBox(acroForm);
checkBox.setPartialName("xxx");
PDAnnotationWidget widget = new PDAnnotationWidget();
widget.setRectangle(new PDRectangle(100, 100, 10, 10));
widget.setAnnotationFlags(4);
widget.setPage(page);
widget.setParent(checkBox);
List<PDAnnotationWidget> widgets = new ArrayList<>();
widgets.add(widget);
page.getAnnotations().add(widget);
checkBox.setWidgets(widgets);
acroForm.getFields().add(checkBox);
document.getDocumentCatalog().setAcroForm(acroForm);
File file = new File("test.pdf");
document.save(file);
document.close();
}
}
最佳答案
试试这个 - 它为复选框创建外观流,即"is"和“关闭”显示的内容流。我还修改了您使用小部件的方式,使文件更简单。您使用的策略(小部件与字段分开)只有在一个字段有多个小部件时才有用。
要了解运算符的作用(那是胡言乱语),请查看 PDF specification , 搜索“运算符摘要”。
public static void main(String[] args) throws IOException
{
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
// just a rectangle to be able to locate the checkbox
PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, false);
contentStream.addRect(100, 100, 50, 50);
contentStream.setLineWidth(1);
contentStream.setNonStrokingColor(Color.WHITE);
contentStream.setStrokingColor(Color.BLACK);
contentStream.stroke();
contentStream.close();
PDAcroForm acroForm = new PDAcroForm(document);
PDCheckBox checkBox = new PDCheckBox(acroForm);
checkBox.setPartialName("xxx");
//PDAnnotationWidget widget = new PDAnnotationWidget();
PDAnnotationWidget widget = checkBox.getWidgets().get(0);
widget.setRectangle(new PDRectangle(100, 100, 10, 10));
widget.setAnnotationFlags(4);
widget.setPage(page);
//widget.setParent(checkBox);
// inspired by annot 92 of file from PDFBOX-563
// annot 172 has "checkmark" instead, but more more complex, needs ZaDb
String offNString = "1 g\n"
+ "0 0 9.5 9.5 re\n"
+ "f\n"
+ "0.5 0.5 9.5 9.5 re\n"
+ "s";
String offDString = "0.75 g\n"
+ "0 0 9.5 9.5 re\n"
+ "f\n"
+ "0.5 0.5 9.5 9.5 re\n"
+ "s";
String yesNString = "1 g\n"
+ "0 0 9 9.5 re\n"
+ "f\n"
+ "0.5 0.5 9.5 9.5 re\n"
+ "s\n"
+ "q\n"
+ " 1 1 9 9 re\n"
+ " W\n"
+ " n\n"
+ " 2 8 m\n"
+ " 8 2 l\n"
+ " 8 8 m\n"
+ " 2 2 l\n"
+ " s\n"
+ "Q";
String yesDString = "0.75 g\n"
+ "0 0 9 9.5 re\n"
+ "f\n"
+ "0.5 0.5 9.5 9.5 re\n"
+ "s\n"
+ "q\n"
+ " 1 1 9 9 re\n"
+ " W\n"
+ " n\n"
+ " 2 8 m\n"
+ " 8 2 l\n"
+ " 8 8 m\n"
+ " 2 2 l\n"
+ " s\n"
+ "Q";
COSDictionary apNDict = new COSDictionary();
COSStream offNStream = new COSStream();
offNStream.setItem(COSName.BBOX, new PDRectangle(10, 10));
offNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
offNStream.setItem(COSName.TYPE, COSName.XOBJECT);
offNStream.setItem(COSName.SUBTYPE, COSName.FORM);
offNStream.setItem(COSName.MATRIX, new Matrix().toCOSArray());
offNStream.setItem(COSName.RESOURCES, new COSDictionary());
OutputStream os = offNStream.createOutputStream();
os.write(offNString.getBytes());
os.close();
apNDict.setItem(COSName.Off, offNStream);
COSStream yesNStream = new COSStream();
yesNStream.setItem(COSName.BBOX, new PDRectangle(10, 10));
yesNStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
yesNStream.setItem(COSName.TYPE, COSName.XOBJECT);
yesNStream.setItem(COSName.SUBTYPE, COSName.FORM);
yesNStream.setItem(COSName.MATRIX, new Matrix().toCOSArray());
yesNStream.setItem(COSName.RESOURCES, new COSDictionary());
os = yesNStream.createOutputStream();
os.write(yesNString.getBytes());
os.close();
apNDict.setItem(COSName.getPDFName("Yes"), yesNStream);
COSDictionary apDDict = new COSDictionary();
COSStream offDStream = new COSStream();
offDStream.setItem(COSName.BBOX, new PDRectangle(16, 16));
offDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
offDStream.setItem(COSName.TYPE, COSName.XOBJECT);
offDStream.setItem(COSName.SUBTYPE, COSName.FORM);
offDStream.setItem(COSName.MATRIX, new Matrix().toCOSArray());
offDStream.setItem(COSName.RESOURCES, new COSDictionary());
os = offDStream.createOutputStream();
os.write(offDString.getBytes());
os.close();
apDDict.setItem(COSName.Off, offDStream);
COSStream yesDStream = new COSStream();
yesDStream.setItem(COSName.BBOX, new PDRectangle(16, 16));
yesDStream.setItem(COSName.FORMTYPE, COSInteger.ONE);
yesDStream.setItem(COSName.TYPE, COSName.XOBJECT);
yesDStream.setItem(COSName.SUBTYPE, COSName.FORM);
yesDStream.setItem(COSName.MATRIX, new Matrix().toCOSArray());
yesDStream.setItem(COSName.RESOURCES, new COSDictionary());
os = yesDStream.createOutputStream();
os.write(yesDString.getBytes());
os.close();
apDDict.setItem(COSName.getPDFName("Yes"), yesDStream);
PDAppearanceDictionary appearance = new PDAppearanceDictionary();
PDAppearanceEntry appearanceNEntry = new PDAppearanceEntry(apNDict);
appearance.setNormalAppearance(appearanceNEntry);
// push appearance doesn't look nice enough, has weird effect when pushing
// PDAppearanceEntry appearanceDEntry = new PDAppearanceEntry(apDDict);
// appearance.setDownAppearance(appearanceDEntry);
widget.setAppearance(appearance);
// MK (appearance characteristics dictionary)
COSDictionary acdDict = new COSDictionary();
acdDict.setItem(COSName.CA, new COSString("8")); // 8 is X, 4 is checkmark
COSArray bcArray = new COSArray();
bcArray.add(COSInteger.ZERO);
acdDict.setItem(COSName.BC, bcArray);
COSArray bgArray = new COSArray();
bgArray.add(COSInteger.ONE);
acdDict.setItem(COSName.BG, bgArray);
PDAppearanceCharacteristicsDictionary acd = new PDAppearanceCharacteristicsDictionary(acdDict);
widget.setAppearanceCharacteristics(acd);
// List<PDAnnotationWidget> widgets = new ArrayList<>();
// widgets.add(widget);
page.getAnnotations().add(widget);
// checkBox.setWidgets(widgets);
checkBox.setValue("Yes");
acroForm.getFields().add(checkBox);
document.getDocumentCatalog().setAcroForm(acroForm);
File file = new File("checkbox.pdf");
document.save(file);
document.close();
}
2019 年 1 月 17 日更新:我创建了此代码的更灵活版本(动态计算、支持颜色和不同内容)并将其添加到 source code repository .
关于java - 如何为复选框添加边框并使其始终可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23827757/
我是一名优秀的程序员,十分优秀!