Java PDFBox中奇怪的组合框行为
我有一个在PDF文件中创建组合框的代码。它有两个问题Java PDFBox中奇怪的组合框行为,java,pdfbox,Java,Pdfbox,我有一个在PDF文件中创建组合框的代码。它有两个问题 当组合框打开时,特殊字符(如ö)会正确显示,但当组合框关闭时,则无法显示 当我在Acrobat中打开PDF,更改值并保存PDF时,组合框不知何故消失了。当我再次打开PDF时,它不再显示 我是不是把PDFBox类搞砸了,还是出了什么问题 以下是处于打开状态的图片: 这里有一个处于关闭状态: 公共类组合测试{ 公共静态void main(字符串[]args){ PDFont font=PDType1Font.HELVETICA; 颜色=颜色。
公共类组合测试{
公共静态void main(字符串[]args){
PDFont font=PDType1Font.HELVETICA;
颜色=颜色。黑色;
浮点数=12;
PDDocument文档=新PDDocument();
PDPage page=新的PDPage(PD矩形.A4);
文件。添加页(第页);
PDAcroForm acroForm=新的PDAcroForm(文件);
PDCOMBOX组合框=新的PDCOMBOX(acroForm);
comboBox.setPartialName(“测试”);
字符串defaultAppearanceString=“/”+font.getName()+“”+fontSize+“Tf”
+0+“”+0+“”+0+“”+0+“rg”;
comboBox.setDefaultAppearance(defaultAppearanceString);
PDAnnotationWidget=新的PDAnnotationWidget();
setRectangle(新的PDRectangle(20020020010020));
widget.setAnnotationFlags(4);
设置页面(第页);
setParent(组合框);
List exportValues=new ArrayList();
List displayValues=新建ArrayList();
displayValues.add(“öne”);
添加(“两个”);
显示值。添加(“thrée”);
出口价值。添加(“1”);
出口价值。添加(“2”);
出口价值。添加(“3”);
设置选项(导出值、显示值);
List widgets=new ArrayList();
widgets.add(widget);
试一试{
page.getAnnotations().add(小部件);
}捕获(IOE异常){
e、 printStackTrace();
}
setWidgets(widgets);
试一试{
FileOutputStream输出=新的FileOutputStream(“test.pdf”);
文件保存(输出);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
在代码末尾添加以下内容:
acroForm.getFields().add(comboBox);
document.getDocumentCatalog().setAcroForm(acroForm);
这确保PDF知道您的acroform及其字段
对于特殊字符,将Helvetica字体的名称替换为“Helv”,这是Adobe的标准名称
更好、更干净的解决方案:设置默认资源
PDResources dr = new PDResources();
dr.put(COSName.getPDFName("Helv"), font);
acroForm.setDefaultResources(dr);
您也可以使用COSName.getPDFName(font.getName())
,而不是“Helv”,但它在默认外观字符串中必须相同
因此,完整代码现在是:
public class ComboTest
{
public static void main(String[] args)
{
PDFont font = PDType1Font.HELVETICA;
Color color = Color.BLACK;
float fontSize = 12;
PDDocument document = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDAcroForm acroForm = new PDAcroForm(document);
PDComboBox comboBox = new PDComboBox(acroForm);
comboBox.setPartialName("test");
// Helv instead of Helvetica
String defaultAppearanceString = "/Helv " + fontSize + " Tf "
+ 0 + " " + 0 + " " + 0 + " rg";
comboBox.setDefaultAppearance(defaultAppearanceString);
PDAnnotationWidget widget = new PDAnnotationWidget();
widget.setRectangle(new PDRectangle(200, 200, 100, 20));
widget.setAnnotationFlags(4);
widget.setPage(page);
widget.setParent(comboBox);
List<String> exportValues = new ArrayList<>();
List<String> displayValues = new ArrayList<>();
displayValues.add("öne");
displayValues.add("two");
displayValues.add("thrée");
exportValues.add("1");
exportValues.add("2");
exportValues.add("3");
comboBox.setOptions(exportValues, displayValues);
List<PDAnnotationWidget> widgets = new ArrayList<>();
widgets.add(widget);
try
{
page.getAnnotations().add(widget);
}
catch (IOException e)
{
e.printStackTrace();
}
comboBox.setWidgets(widgets);
// new
acroForm.getFields().add(comboBox);
document.getDocumentCatalog().setAcroForm(acroForm);
PDResources dr = new PDResources();
dr.put(COSName.getPDFName("Helv"), font);
acroForm.setDefaultResources(dr);
try
{
FileOutputStream output = new FileOutputStream("test.pdf");
document.save(output);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
公共类组合测试
{
公共静态void main(字符串[]args)
{
PDFont font=PDType1Font.HELVETICA;
颜色=颜色。黑色;
浮点数=12;
PDDocument文档=新PDDocument();
PDPage page=新的PDPage(PD矩形.A4);
文件。添加页(第页);
PDAcroForm acroForm=新的PDAcroForm(文件);
PDCOMBOX组合框=新的PDCOMBOX(acroForm);
comboBox.setPartialName(“测试”);
//Helv而不是Helvetica
字符串defaultAppearanceString=“/Helv”+fontSize+“Tf”
+0+“”+0+“”+0+“”+0+“rg”;
comboBox.setDefaultAppearance(defaultAppearanceString);
PDAnnotationWidget=新的PDAnnotationWidget();
setRectangle(新的PDRectangle(20020020010020));
widget.setAnnotationFlags(4);
设置页面(第页);
setParent(组合框);
List exportValues=new ArrayList();
List displayValues=新建ArrayList();
displayValues.add(“öne”);
添加(“两个”);
显示值。添加(“thrée”);
出口价值。添加(“1”);
出口价值。添加(“2”);
出口价值。添加(“3”);
设置选项(导出值、显示值);
List widgets=new ArrayList();
widgets.add(widget);
尝试
{
page.getAnnotations().add(小部件);
}
捕获(IOE异常)
{
e、 printStackTrace();
}
setWidgets(widgets);
//新的
acroForm.getFields().add(组合框);
document.getDocumentCatalog().setAcroForm(acroForm);
PDResources dr=新的PDResources();
dr.put(COSName.getPDFName(“Helv”),字体);
acroForm.setDefaultResources(dr);
尝试
{
FileOutputStream输出=新的FileOutputStream(“test.pdf”);
文件保存(输出);
}
捕获(IOE异常)
{
e、 printStackTrace();
}
}
}
re 2),将其添加到代码中:acroForm.getFields().add(组合框);document.getDocumentCatalog().setAcroForm(acroForm)代码>。你从哪里得到这个代码的?我在网上找不到任何例子,所以我自己试了一下。感谢这项工作,现在它不再消失了。re 1),将font.getName()替换为“Helv”。不知道为什么会这样。谢谢,这也奏效了!你知道如何从font类中获取这个“Helv”字符串吗?dr.put(“Helv”,font)代码>对我不起作用。第一个参数需要是一个COSName
fixed(希望是)
public class ComboTest
{
public static void main(String[] args)
{
PDFont font = PDType1Font.HELVETICA;
Color color = Color.BLACK;
float fontSize = 12;
PDDocument document = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDAcroForm acroForm = new PDAcroForm(document);
PDComboBox comboBox = new PDComboBox(acroForm);
comboBox.setPartialName("test");
// Helv instead of Helvetica
String defaultAppearanceString = "/Helv " + fontSize + " Tf "
+ 0 + " " + 0 + " " + 0 + " rg";
comboBox.setDefaultAppearance(defaultAppearanceString);
PDAnnotationWidget widget = new PDAnnotationWidget();
widget.setRectangle(new PDRectangle(200, 200, 100, 20));
widget.setAnnotationFlags(4);
widget.setPage(page);
widget.setParent(comboBox);
List<String> exportValues = new ArrayList<>();
List<String> displayValues = new ArrayList<>();
displayValues.add("öne");
displayValues.add("two");
displayValues.add("thrée");
exportValues.add("1");
exportValues.add("2");
exportValues.add("3");
comboBox.setOptions(exportValues, displayValues);
List<PDAnnotationWidget> widgets = new ArrayList<>();
widgets.add(widget);
try
{
page.getAnnotations().add(widget);
}
catch (IOException e)
{
e.printStackTrace();
}
comboBox.setWidgets(widgets);
// new
acroForm.getFields().add(comboBox);
document.getDocumentCatalog().setAcroForm(acroForm);
PDResources dr = new PDResources();
dr.put(COSName.getPDFName("Helv"), font);
acroForm.setDefaultResources(dr);
try
{
FileOutputStream output = new FileOutputStream("test.pdf");
document.save(output);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}