2016-03-03 2 views
0

Мне не удалось найти сообщения о переполнении, касающиеся изменения размера или корректировки текстового поля iTextSharp на основе входного содержимого пользователя, которое у них есть на C#. Я надеялся, что кто-нибудь может помочь мне здесь, поскольку это оказалось для меня довольно сложным.Определить размер текстового поля iTextSharp на основе того, сколько контента пользователь вводит в C#

Вот что я хочу достичь. Основываясь на количестве ввода текста пользователя, я хочу иметь возможность изменять размер текстового поля iTextSharp без добавления текстового содержимого или изменения размера шрифта в конце текстового поля.

Вот блок кода, который у меня есть для текстового поля до сих пор:

using iTextSharp.text.pdf; 


string bodyText = "This is the text that the user inputs. I want the textfield to resize "; 
     bodyText += "based on how much text content there is here. I do not want the "; 
     bodyText += "text to wrap around or shrink text size at the end of the textfield."; 

PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(strPDFpath, FileMode.Create)); 
PdfContentByte cb = writer.DirectContent; 
TextField _subject = new TextField(writer, new Rectangle(103f, 485f, 503, 499f), "tfSubject"); 
    //I want this Rectangle size to be readjustable based on the text content but 
    //I'm not sure how to do that. 

_subject.FontSize = 10f; 
_subject.Alignment = Element.ALIGN_LEFT; 
_subject.Text = bodyText; 
writer.AddAnnotation(_subject.GetTextField()); 
cb = writer.DirectContent; 

Мало того, что, после того, как TextField был изменен, я хочу, чтобы иметь возможность добавить статический текст прямо под измененным размером текстовое поле. Это оказывается довольно сложным, поскольку текстовое поле устанавливается в абсолютном позиционировании.

Любая помощь будет очень признательна.

+0

Ваш вопрос непонятен. В названии вы утверждаете, что хотите * re * размер текстового поля, что означает, что у вас есть существующий PDF-файл с существующим текстовым полем. В теле вопроса вы создаете текстовое поле, как будто вы создаете документ с нуля. Что вам нужно? Вы хотите * re * размер существующего текстового поля или определить размер нового текстового поля? –

+0

Я хочу определить размер нового текстового поля на основе строкового содержимого, которое будет вводить пользователь. –

+0

В конечном итоге вы хотите [измерить строку на основе заданного шрифта и размера, справа] (http://stackoverflow.com/a/5092566/231316)? Эта ссылка должна вам больше всего понравиться, вам просто нужно учитывать заполнение виджета, зависящее от приложения, но вы можете вымачивать некоторые цифры, которые, вероятно, работают в большинстве мест. –

ответ

0

Принимали ли вы взглянуть на ответ на этот вопрос: Add PdfPCell to Paragraph

В этом ответе, мы создаем форму, которая выглядит следующим образом:

enter image description here

Как вы можете видеть, размер полей формы отличается в зависимости от длины ожидаемого нами контента.

Как это делается? Это легко: мы используем объекты Chunk с общими событиями тегов, чтобы добавить поля. См GenericFields пример:

public class FieldChunk extends PdfPageEventHelper { 
    @Override 
    public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) { 
     TextField field = new TextField(writer, rect, text); 
     try { 
      writer.addAnnotation(field.getTextField()); 
     } catch (IOException ex) { 
      throw new ExceptionConverter(ex); 
     } catch (DocumentException ex) { 
      throw new ExceptionConverter(ex); 
     } 
    } 
} 

Этот фрагмент написан на Java, но это должно быть довольно легко портировать его на C# (просто делать вид, что я написал псевдо-код, если вы не знаете, Java).

Мы можем использовать это событие страницы, как это:

public void createPdf(String dest) throws IOException, DocumentException { 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    writer.setPageEvent(new FieldChunk()); 
    document.open(); 
    Paragraph p = new Paragraph(); 
    p.add("The Effective Date is "); 
    Chunk day = new Chunk("  "); 
    day.setGenericTag("day"); 
    p.add(day); 
    p.add(" day of "); 
    Chunk month = new Chunk("  "); 
    month.setGenericTag("month"); 
    p.add(month); 
    p.add(", "); 
    Chunk year = new Chunk("   "); 
    year.setGenericTag("year"); 
    p.add(year); 
    p.add(" that this will begin."); 
    document.add(p); 
    document.close(); 
} 

Как вы можете видеть, длина поля определяется числом пространств мы вводим в Chunk:

Chunk day = new Chunk("  "); 
Chunk month = new Chunk("  "); 
Chunk year = new Chunk("   "); 

Чем больше пробелов, тем шире поле.

Использование Chunk s значительно облегчит вам введение дополнительного статического содержимого под каждым полем.

Для многострочных текстовых полей я предлагаю использовать PdfPTable и событие ячейки. Добавление поля в ячейку таблицы показано в примерах Create fields in a table на official web site.

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