2015-01-30 4 views
1

У меня проблема с использованием Itext pdf. Проблема заключается в том, что после выбора опции и указателя сфокусирован на другом элементе pdf, текст в TextField как-то отрезан или некоторые буквы переполнены. Каким будет решение? Изображение, которое показывает, что происходит enter image description here Куски кода являютсяИсходная выписка Itext, ширина выделенной опции

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

ответ

1

Пожалуйста, обратите внимание на 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, а затем количество детей combo1, combo2 ... так что у вас есть myCombos.combo1, myCombos.combo2 и т.д ...

Если это так, пожалуйста, используйте метод createEmpty() вместо метода createTextField().

Почему вы хотите встроить шрифт?

Это не имеет смысла:

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

Вы используете BaseFont.TIMES_ROMAN, который является стандартным Тип 1 шрифт. Стандартные шрифты Type 1: never, встроенные iText, потому что они должны присутствовать в каждом читателе. Следовательно, параметр true для метода createFont() будет проигнорирован.

В чем причина проблемы?

Когда вы определяете шрифт, iText будет использовать только очень небольшую часть данных шрифта. В частности: только информация, необходимая для создания внешнего вида символов, которые используются «Выберите первый вариант». В этом случае «c» и «d» отсутствуют. Следовательно, когда Adobe Reader должен отображать второе слово, у него будут проблемы с отсутствующими символами.

Вы можете избежать этого, добавив:

font.setSubset(false); 

Или, используя совершенно другой шрифт.

+0

Это что-то немного странно, потому что когда я помещал строку 'tf.setFont (BaseFont.createFont (BaseFont.TIMES_ROMAN, BaseFont.CP1250, true)),' тогда это перепутано, что бы то ни было 'истина' или' false'. Но когда я использую другой шрифт, то есть 'baseFont = BaseFont.createFont (« c: /windows/fonts/arial.ttf », BaseFont.CP1250, BaseFont.EMBEDDED),' все идет хорошо. Я нашел дополнительную информацию об этой проблеме на [странице] (http://www.pdfa.org/2011/08/pdfa-%E2%80%93-a-look-at-the-technical-side/) Довольно сложно сказать. –

+0

Если вы прочитали [iText documentation] (http://itextpdf.com/learn), вы поймете, почему iText * никогда * не встраивает шрифты Standard Type 1 («что бы то ни было« true »или« false »). Это преднамеренный выбор дизайна. Однако: выбор только для добавления информации о подмножестве необработанного шрифта теперь обсуждается в iText. Мы можем изменить это в будущей версии. –

Смежные вопросы