Java PDFBox中奇怪的组合框行为

Java PDFBox中奇怪的组合框行为,java,pdfbox,Java,Pdfbox,我有一个在PDF文件中创建组合框的代码。它有两个问题 当组合框打开时,特殊字符(如ö)会正确显示,但当组合框关闭时,则无法显示 当我在Acrobat中打开PDF,更改值并保存PDF时,组合框不知何故消失了。当我再次打开PDF时,它不再显示 我是不是把PDFBox类搞砸了,还是出了什么问题 以下是处于打开状态的图片: 这里有一个处于关闭状态: 公共类组合测试{ 公共静态void main(字符串[]args){ PDFont font=PDType1Font.HELVETICA; 颜色=颜色。

我有一个在PDF文件中创建组合框的代码。它有两个问题

  • 当组合框打开时,特殊字符(如ö)会正确显示,但当组合框关闭时,则无法显示
  • 当我在Acrobat中打开PDF,更改值并保存PDF时,组合框不知何故消失了。当我再次打开PDF时,它不再显示
  • 我是不是把PDFBox类搞砸了,还是出了什么问题

    以下是处于打开状态的图片:

    这里有一个处于关闭状态:

    公共类组合测试{
    公共静态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();
            }
    
        }
    }