java - Itext组合框,所选选项的宽度问题

标签 java combobox itext

我在使用 Itext pdf 时遇到问题。问题是,选择一个选项并将指针聚焦在 pdf 的另一个元素上后,TextField 中的文本会以某种方式被切断或某些字母浮在上面。解决办法是什么? 显示正在发生的情况的图像 enter image description here 代码块是

    @Override
public void writePdfElement(RankingQuestionDTO input, Document document, PdfWriter writer, PdfPTable baseTable)  {

    try{
        PdfPTable table = new PdfPTable(2);
        PdfPCell cell;
        document.add(new Paragraph(input.getText(), stylesService.getHeaderFont()));
        //Add rows with selectors
        PdfFormField selectGroup = PdfFormField.createTextField(writer, true, false, 10);
        selectGroup.setFieldName(String.format("%s", input.getUuid()));
        ArrayList<RankingAnswerDTO> possibleAnswers = input.getPossibleAnswers();
        for(int i = 0; i <input.getPossibleAnswers().size(); i++) {
            cell = new PdfPCell();
            cell.setPhrase(getPolishTablePhrase(input.getText()));
            cell.setPadding(stylesService.getPaddingCell());
            table.addCell(cell);
            cell = new PdfPCell();
            cell.setPadding(stylesService.getPaddingCell());
            cell.setCellEvent(new SelectCellEvent(String.format("%s",i), selectGroup, writer, stylesService,
                    possibleAnswers));
            cell.setMinimumHeight(stylesService.getMinimumHeight());
            table.addCell(cell);
        }
        baseTable.addCell(table);
        document.add(baseTable);
        writer.addAnnotation(selectGroup);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

    @Override
    public void cellLayout(PdfPCell cell, Rectangle position,
                       PdfContentByte[] canvases) {

    Rectangle rect = stylesService.getSelectFiledRectangle(position, sizeOfRect);
    // define the select box
    TextField tf = new TextField(writer, rect, name);

    try {
        tf.setFont(BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, true));
    } catch (DocumentException | IOException e) {
        e.printStackTrace();
    }
    tf.setBackgroundColor(stylesService.getBackgroundColor());
    tf.setBorderColor(stylesService.getBorderColor());
    tf.setBorderStyle(PdfBorderDictionary.STYLE_BEVELED);
    tf.setVisibility(TextField.VISIBLE_BUT_DOES_NOT_PRINT);
    tf.setBorderColor(BaseColor.GRAY);
    tf.setBorderWidth(stylesService.getFloatBorderWidth());
    tf.setFontSize(stylesService.getFieldFloatFont());
    tf.setChoices(select);
    tf.setChoiceExports(ranks);
    tf.setAlignment(Element.ALIGN_CENTER);
    tf.setOptions(TextField.MULTILINE);
    tf.setRotation(0);
    // add the select box as a field
    try {
        selectGroup.addKid(tf.getComboField());
    } catch (Exception e) {
        throw new ExceptionConverter(e);
    }
}

问题出在字体设置上。 以下方法效果很好

private void initializeBaseFont() {
    try {
        baseFont = BaseFont.createFont("c:/windows/fonts/arial.ttf", BaseFont.CP1250, BaseFont.EMBEDDED);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

而不是

tf.setFont(BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, true));

最佳答案

请查看 ComboBoxItems示例:

这是单元格事件实现:

class SelectCellEvent implements PdfPCellEvent {
    protected PdfFormField selectGroup;
    protected String name;
    protected String[] exports;
    protected String[] options;
    protected BaseFont font;

    public SelectCellEvent(PdfFormField selectGroup, String name, String[] exports, String[] options) throws DocumentException, IOException {
        this.selectGroup = selectGroup;
        this.name = name;
        this.exports = exports;
        this.options = options;
        font = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.NOT_EMBEDDED);
        font.setSubset(false);
    }

    public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
        PdfWriter writer = canvases[0].getPdfWriter();
        TextField tf = new TextField(writer, position, name);
        tf.setFont(font);
        tf.setBorderStyle(PdfBorderDictionary.STYLE_BEVELED);
        tf.setVisibility(TextField.VISIBLE_BUT_DOES_NOT_PRINT);
        tf.setBorderColor(BaseColor.GRAY);
        tf.setChoiceExports(exports);
        tf.setChoices(options);
        tf.setAlignment(Element.ALIGN_CENTER);
        try {
            selectGroup.addKid(tf.getComboField());
        } catch (Exception e) {
            throw new ExceptionConverter(e);
        }
    }
}

这是 PDF 创建过程:

public void createPdf(String dest) throws IOException, DocumentException {
    Rectangle pagesize = PageSize.LETTER;
    Document document = new Document(pagesize);
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    PdfPTable table = new PdfPTable(2);
    PdfPCell cell;
    //Add rows with selectors
    PdfFormField selectGroup = PdfFormField.createEmpty(writer);
    selectGroup.setFieldName("myCombos");
    String[] options = {"Choose first option", "Choose second option", "Choose third option"};
    String[] exports = {"option1", "option2", "option3"};
    table.addCell("Combobox:");
    cell = new PdfPCell();
    cell.setCellEvent(new SelectCellEvent(selectGroup, "combo1", exports, options));
    cell.setMinimumHeight(20);
    table.addCell(cell);
    document.add(table);
    writer.addAnnotation(selectGroup);
    document.close();
}

您的代码中有很多我不明白的地方。

什么是 selectGroup?

您似乎有几个组合框(在我的示例中只有一个),它们是名为 selectGroup 的文本字段的子项。为什么 selectGroup 是一个文本字段?我没有看到你在任何地方定义它的尺寸?

我假设您想要创建一个父字段,例如myCombos,然后是一些子 combo1combo2...,这样您就有 myCombos.combo1myCombos.combo2 等...

如果是这种情况,请使用 createEmpty() 方法而不是 createTextField() 方法。

为什么要嵌入字体?

这没有意义:

BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, true)

您使用的是 BaseFont.TIMES_ROMAN,它是标准 Type 1 字体。标准 Type 1 字体永远不会被 iText 嵌入,因为它们应该存在于每个阅读器中。因此,createFont() 方法的 true 参数将被忽略。

问题的原因是什么?

当你定义字体时,iText只会使用字体数据的很小一部分。更具体地说:只有创建“选择第一个选项”所使用的角色外观所需的信息。在本例中缺少“c”和“d”。因此,当 Adob​​e Reader 必须渲染第二个单词时,它会遇到那些丢失字符的问题。

您可以通过添加以下内容来避免这种情况:

font.setSubset(false);

或者使用完全不同的字体。

关于java - Itext组合框,所选选项的宽度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28236902/

相关文章:

macos - Webstart 在 OSX 上运行错误的 jre 版本

c# - ComboBox 的 Editbox 部分被自动选中

java - PDFTable Itext 阿拉伯语

java - 在不同的pdf页面中插入图像

java - 通过itext生成pdf时如何避免单元格中图像过度 float

java - Hibernate CascadeType 内部关联注释与外部关联注释

java - Android Parcelable 错误数组长度

Java泛型、类型删除和泛型成员的类型

c# - 我有两个组合框和xml文件,我想从xml中填充组合框1中的服务器名称,并根据服务器名称填充第二个组合框

wpf - 分组组合框显示组标题,但不显示项目