Найти ширину символа в пикселях для различных размеров шрифтов Arial - PullRequest
2 голосов
/ 13 ноября 2009

У меня есть программа, которая вручную генерирует PDF с использованием PDFsharp в C #. Хотя это довольно утомительно, я должен использовать это, и я близок к завершению задачи. Остается только одна проблема.

Проблема: мне интересно, как я могу узнать, какова ширина данного символа для данного размера шрифта в Arial.

У меня возникли проблемы с поиском более точного метода переноса текста. Прямо сейчас каждый определяет ширину блока в пикселях, а затем приступает к записи строки в этом блоке. Я просто догадываюсь о максимальной длине строки, которая может уместиться в коробке, и есть некоторые визуальные странности, которые время от времени возникают.

Любая помощь?

Спасибо

Ответы [ 3 ]

7 голосов
/ 13 ноября 2009

Я не уверен по вашему вопросу, хотите ли вы измерить размер строки, в частности, используя PDF #, или просто универсальным способом.

В целом .Net можно использовать метод MeasureText класса TextRenderer (из форм Windows):

TextRenderer.MeasureText("some text", new Font("Arial", 1.0f, FontStyle.Regular))

Это вернет Size экземпляр, который будет содержать Width=12, Height=2.

5 голосов
/ 16 ноября 2009

Во времена шрифтов True Type с кернингом и т. Д. Не было ни одной ширины символа. Ширина строки "VA", вероятно, меньше, чем сумма значений ширины строк "V" и "A". Суммируя ширину, если отдельные символы являются отправной точкой - но, наконец, вы должны измерить всю строку.

PDFsharp включает класс XTextFormatter (с полным исходным кодом), который выполняет перенос строк. Его можно адаптировать под конкретные требования. Он использует gfx.MeasureString(token, this.font).Width для измерения ширины строки.

1 голос
/ 14 октября 2010

XGraphics.MeasureString (строка s, шрифт f) делает свое дело.

  //l_Page is of type PdfPage

  var l_Graphics = XGraphics.FromPdfPage( l_Page );
  var l_TitleFont = new Font( "Arial", 15f, GraphicsUnit.World )
  var l_Title = "Hallo Welt";
  //l_TitleSize will be of type XSize and has properties for Width and Height
  var l_TitleSize = l_Graphics.MeasureString( l_Title, l_TitleFont );
...