Как вписать текст (изменить размер шрифта, пока он не уместится) в Rectangle в iTextsharp - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь вставить текст в существующий PDF в абсолютной позиции с фиксированной шириной и высотой.Когда текст слишком велик или его размер шрифта не виден.Я пытался решить эту проблему, как описано в здесь .

Пока ничего не вставлено.Кто-нибудь знает, что я делаю неправильно или мне не хватает?

Вот что я сейчас делаю:

 TextBlock tb = (TextBlock)g.Children[0];
 ColumnText ct = new ColumnText(stamper.GetOverContent(fd.Page));

 float llx=0, lly=0, urx=0, ury = 0;
 float percentX = (float) ((Canvas.GetLeft(g) + tb.Padding.Left)/c.ActualWidth);
 float percentY = (float)((Canvas.GetTop(g) - tb.Padding.Top)/c.ActualHeight);
 float percentWidth = (float)(g.ActualWidth/c.ActualWidth);
 float percentHeight = (float)(g.ActualHeight/c.ActualHeight);

 llx = percentX * reader.GetPageSize(fd.Page).Width;
 lly =(float) (reader.GetPageSize(fd.Page).Height - percentY * reader.GetPageSize(fd.Page).Height);
 urx = llx + percentWidth * reader.GetPageSize(fd.Page).Width;
 ury = lly - percentHeight * reader.GetPageSize(fd.Page).Height;

 ct.SetSimpleColumn(new iTextSharp.text.Rectangle(llx, lly, urx, ury));
 float fontsize = (float) tb.FontSize - 2;
 Boolean fits;
 iTextSharp.text.Paragraph p;
 do {
     p = new iTextSharp.text.Paragraph();
     fontsize -= 0.1f;
     p.Font.Size = fontsize;
     p.Add(tb.Text);
     ct.AddElement(p);
     int status = ct.Go(true);
     fits = !ColumnText.HasMoreText(status);
     status = ct.Go(true);
 } while (!fits && p.Font.Size > 2);
 ct.Go();

1 Ответ

0 голосов
/ 11 марта 2019

Я нашел способ заставить мою проблему работать.На случай, если кто-то захочет узнать, как это работает, вот как я решил эту проблему:

Сначала я имитирую вставку текста в ColumnText с помощью Go (True).После этого я проверяю, подходит ли текст с данным шрифтом в ColumnText или нет.Я уменьшаю размер шрифта, пока он не подходит.

Кажется, что повторного вызова метода Go (false) недостаточно.Я создал новый объект ColumnText и снова вызвал SetSimpleColumn.Вызов метода Go сработал.

Вот код:

 ColumnText ct = new ColumnText(contentByte);
 ct.SetSimpleColumn(rec);
 ct.AddElement(new iTextSharp.text.Paragraph(tb.Text.ToString()));
 int status = ct.Go(true);
 Boolean fits = !ColumnText.HasMoreText(status);
 if (fits)
 {
       ColumnText ctxt = new ColumnText(contentByte);
       ctxt.SetSimpleColumn(rec);
       ctxt.AddElement(new iTextSharp.text.Paragraph(tb.Text.ToString()));
       ctxt.Go();
  }else
  {
       double fontsize = tb.FontSize - 2;
       while(!fits && fontsize > 1)
       {
            fontsize -= 0.1;
            iTextSharp.text.Paragraph p = new iTextSharp.text.Paragraph(tb.Text);
            p.Font = new iTextSharp.text.Font(BaseFont.CreateFont());
            p.Font.Size = (float)fontsize;
            ColumnText ctxt = new ColumnText(contentByte);
            ctxt.SetSimpleColumn(rec);
            ctxt.AddElement(p);
            int stat = ctxt.Go(true);
            fits = !ColumnText.HasMoreText(stat);
       }
       iTextSharp.text.Paragraph par = new iTextSharp.text.Paragraph(tb.Text);
       par.Font = new iTextSharp.text.Font(BaseFont.CreateFont());
       par.Font.Size = (float)fontsize;
       ColumnText coltxt = new ColumnText(contentByte);
       coltxt.SetSimpleColumn(rec);
       coltxt.AddElement(par);
       coltxt.Go();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...