我正在尝试使用iTextSharp将图像写入PDF,但除了正在编写的图像之外,我还需要向PDF添加文本。似乎最好的方法是将文本写为图像并将其插入页面。一切正常,但是当我看一下文字时,我发现它的质量低于我喜欢的质量。我最终得到这样的东西:
你可以看到有很多"点"与周围的固体背景不同。这是我用来绘制文本的代码:
httpMultipartContent.Add( httpMultipartContent );
以及PDF编写者的相关文字:
httpMultipartContent.Add( httpStreamContent );
我不确定这是iTextSharp 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;
}
或绘图方法的问题,但我想稍微清理一下背景颜色。您可以看到我尝试使用 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);
方法评论过的各种方法。
任何想法都会受到赞赏。
谢谢!
答案 0 :(得分: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));
和只有检查您是否仍想优化TextRenderingHint
!
注意,这个答案严格来说是要删除文字周围的文物。
将文本输入PFD
文档的最佳且完全可扩展的方法是输入真实文本,而不是位图,就像mkl评论的那样。如何使用ITextSharp
并在您的应用程序的上下文中这是一个很好的,您可能想要发布的新问题。 (包括你的失败努力和所需结果的图像......!)
答案 1 :(得分: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);
}
}
}
}
这是我的输出文件:
非常酷。这是我几个小时前给你那个upvote的理由。