2016-01-06 56 views
2

繪製文本時的低分辨率圖像我想用iTextSharp將圖像寫入PDF中,但除了正在寫入的圖像外,我還需要將文本添加到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

您嘗試的TextRenderingHintSmoothingMode值實際上會適得其反。

如果您不希望在文本週圍旋轉的抗鋸齒像素將它們關閉! 將TextRenderingHint設置爲SingleBitPerPixelGridFitSingleBitPerPixel應該會更好。

即使SmoothingMode.AntiAlias像素化肯定不會那麼強,如果你沒有另存爲jpeg這可能是唯一真正的錯誤

每當文本參與不使用jpeg,這是嚴格的照片但使用png

所以第一變化

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

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

檢查,如果你仍然想的,進而優化TextRenderingHint

注意這個答案是嚴格擺脫文字周圍的文物。

將文本輸入到PFD文檔中的最佳和完全可縮放的方式是輸入真實文本,而不是位圖,就像mkl評論過的一樣。如何使用ITextSharp以及在應用程序的上下文中這樣做是一個很好的新問題,您可能需要發佈。 (包括你失敗的努力和期望的結果的形象..!)

+0

把它從jpeg改爲png就做到了;我根本不需要改變'TextRenderingHint'。萬分感謝! – awh112

0

我用你的代碼,它出來很不錯。

我清理,打破它分成兩(2)不同的方法的方法,然後我就開始用較大的位圖(而不是1x1):

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

很酷。這是我幾個小時前給你提供讚賞的理由。