簡體   English   中英

PDFBox 中的奇怪組合框行為

[英]Strange combobox behavior in PDFBox

我有這段代碼可以在 PDF 文件中創建一個組合框。 它有兩個問題。

  1. 特殊字符(如 ö)在組合框打開時正確顯示,但在組合框關閉時無法顯示。
  2. 當我在 Acrobat 中打開 PDF,更改值並保存 PDF 時,組合框不知何故消失了。 當我再次打開 PDF 時,它不再顯示。

我是否搞砸了 PDFBox 類或可能是什么問題?

這是打開狀態下的圖片:

打開

這是一個處於關閉狀態的:

關閉

    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");

        String defaultAppearanceString = "/" + font.getName() + " " + 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);


        try {
            FileOutputStream output = new FileOutputStream("test.pdf");
            document.save(output);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    }

在代碼末尾附近,添加以下內容:

acroForm.getFields().add(comboBox);
document.getDocumentCatalog().setAcroForm(acroForm);

這可確保 PDF 知道您的 acroform 及其字段。

對於特殊字符,將 Helvetica 字體的名稱替換為“Helv”,這是 Adob​​e 的標准名稱。

更好、更簡潔的解決方案:設置默認資源。

PDResources dr = new PDResources();
dr.put(COSName.getPDFName("Helv"), font);
acroForm.setDefaultResources(dr);

除了“Helv”,您還可以使用COSName.getPDFName(font.getName()) ,但它必須與您的默認外觀字符串相同。

所以完整的代碼現在是:

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();
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM