2016-01-06 3 views
2

Я пытаюсь записать изображение в PDF с помощью iTextSharp, но помимо написанных изображений мне также нужно добавить текст в PDF. Кажется, лучший способ сделать это - написать текст как изображение и вставить его на страницу. Все работает отлично, но когда я смотрю на текст, я вижу, что это более низкое качество, чем хотелось бы. Я в конечном итоге получить что-то вроде этого:Изображение с низким разрешением при рисовании текста с использованием System.Drawing

enter image description here

Вы можете видеть, что есть много «точки», которые отличаются от окружающего сплошного фона. Вот код, я использую, чтобы нарисовать текст:

private System.Drawing.Image DrawText(String text, System.Drawing.Font font, Color textColor, Color backColor) 
    { 
     Bitmap img = new Bitmap(1, 1); 
     Graphics drawing = Graphics.FromImage(img); 

     SizeF textSize = drawing.MeasureString(text, font); 

     img.Dispose(); 
     drawing.Dispose(); 

     img = new Bitmap((int) textSize.Width, (int) textSize.Height); 
     //img.SetResolution(200, 200); 

     drawing = Graphics.FromImage(img); 

     drawing.Clear(backColor); 

     Brush textBrush = new SolidBrush(textColor); 

     drawing.DrawString(text, font, textBrush, 0, 0); 
     //drawing.TextRenderingHint = TextRenderingHint.AntiAlias; 
     //drawing.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
     //drawing.SmoothingMode = SmoothingMode.HighQuality; 

     //img.MakeTransparent(Color.MediumAquamarine); 

     drawing.Save(); 

     textBrush.Dispose(); 
     drawing.Dispose(); 

     return img; 
    } 

и соответствующий текст из PDF автор:

var name = DrawText(Request.Form["name"], font, Color.Black, Color.White); 
    ... 
    Image titleImg = Image.GetInstance(title.ToStream(ImageFormat.Jpeg)); 
    titleImg.SetAbsolutePosition(float.Parse(Request.Form["x"]), float.Parse(Request.Form["y"])); 
    titleImg.ScaleToFit(16, 16);   
    pdfContentByte.AddImage(titleImg); 

я не уверен, если это проблема с iTextSharp ScaleToFit() или метод рисования, но я бы немного очистил цвет фона. Вы можете увидеть различные методы, которые я пытался прокомментировать из метода DrawText().

Любые мысли будут оценены.

Спасибо!

+2

Если бы я был вами, я бы не нарисовал текст как растровое изображение в первую очередь, я бы использовал текст PDF, показывающий операторы, допускающие произвольную гладкость записи. – mkl

+0

@mkl Что вы имеете в виду? Есть ли у вас пример использования того, что вы упомянули выше? Когда я попытался добавить текст в PDF, это не сработало, как я бы надеялся ... он просто создал новые страницы вместо добавления туда, где мне это нужно, которые в основном являются токенами внутри документа. – awh112

ответ

4

Оцененные вами значения TextRenderingHint и SmoothingMode на самом деле контрпродуктивны.

Если вы не хотите, чтобы сглаживающие пиксели, вращающиеся вокруг текста, отключили их! Установка TextRenderingHint на SingleBitPerPixelGridFit или SingleBitPerPixel должна работать лучше.

Но даже SmoothingMode.AntiAlias пикселизация, конечно, не будет столь сильным, если вы не сохранить какjpeg, , который, вероятно, является единственной реальной ошибкой.

Когда текст участвует не используютjpeg, который строго для фотографий но использоватьpng!

Так первый изменение

Image titleImg = Image.GetInstance(title.ToStream(ImageFormat.Jpeg)); 

в

Image titleImg = Image.GetInstance(title.ToStream(ImageFormat.Png)); 

и только тогда проверить, если вы все еще хотите optimze в TextRenderingHint!

Примечание, что этот ответ строго касается избавления от артефактов вокруг вашего текста.

Лучший и полностью масштабируемый способ ввода текста в документ PFD - это ввести реальный текст, а не растровые изображения, точно так же, как прокомментировал mkl. Как это сделать с ITextSharp и в контексте вашего приложения - это хороший, новый вопрос, который вы хотите опубликовать. (Включите свои неудачные усилия и изображение желаемого результата ..!)

+0

сменил его с jpeg на png, сделал трюк; Мне вообще не пришлось менять «TextRenderingHint». Благодаря тонну! – awh112

0

Я использовал ваш код, и он получился довольно приятным.

я вымыл метод, который разбил его на два (2) отдельных методов, то я начал с большим Bitmap (не 1х1):

using System; 
using System.Drawing; 

class Program 
{ 

    public static Color COLOR_TEXT = Color.Red; 
    public static Color COLOR_BACK = Color.White; 

    static void Main(string[] args) 
    { 
     var font = new Font(FontFamily.GenericMonospace, 35); 
     var image = DrawClass.DrawText2("Stack Overflow\r\n\tby jp2code", font, COLOR_TEXT, COLOR_BACK); 
     image.Save("C:\\jp2code.bmp"); 
    } 

    public static Image DrawText2(String text, Font font, Color textColor, Color backColor) 
    { 
     var textSize = GetTextSize(text, font); 
     var result = new Bitmap((int)textSize.Width, (int)textSize.Height); 
     using (var g = Graphics.FromImage(result)) 
     { 
      g.Clear(backColor); 
      var brush = new SolidBrush(textColor); 
      g.DrawString(text, font, brush, 0, 0); 
      g.Save(); 
     } 
     return result; 
    } 

    public static SizeF GetTextSize(String text, Font font) 
    { 
     using (var img = new Bitmap(200, 100)) 
     { 
      using (var g = Graphics.FromImage(img)) 
      { 
       return g.MeasureString(text, font); 
      } 
     } 
    } 

} 

Вот мой выходной файл:

screenshot

Pretty cool. Это было моим аргументом в пользу того, что вы дадите вам эту авантюру несколько часов назад.

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