生成员工卡

我们公司想为我们的员工打印员工卡,所以我们准备了一个模板,其中包含每个人的照片,姓名和部门的占位符。
我们有一个数据库表,其中包括每个人的照片,名称和部门的路径。
我想知道是否有可能遍历该表并将人员数据添加到卡模板中并保存。
我正在使用C#.Net,但如果你知道一个更好的解决方案,我很乐意听。

卡片模板的预览

使用C#和GDI +完全没问题

这是简短的版本:

  1. 创建大小和分辨率正确的Bitmap
  2. 测量您想要在其上的图像和文本的坐标
  3. 从数据库中提取数据
  4. 使用Graphics.DrawImageGraphics.DrawString来创建图形
  5. 以您喜欢的格式保存,最好是PNG因为这样可以保持文字清晰

这里有详细信息:

  1. 您需要计算图像应具有的像素数。 由于您希望能够打印它,您应该使用至少150dpi或200dpi。

您发布的图像没有DPI设置和1004×638像素; 将其设置为150dpi会导致物理尺寸为170×108 mm。 我们假设这没关系..

所以我们用这些参数创建一个位图:

 Size keyCardSize = new Size (1004, 63); float Dpi = 150f; Bitmap bmp = new Bitmap(keyCardSize.Width, keyCardSize.Height); bmp.SetResolution(Dpi, Dpi); 
  1. 下面的代码将使用毫米作为单位。 您可能希望将其更改为其他内容。

查看您的模板,我们看到6个图像(徽标,照片和4个图标)和7个文本块(名称,位置,部门和四个联系人文本)。

使用Graphics G绘制图像或文本的基本命令如下所示:

  G.DrawImage(bitmap, location); G.DrawString(text, font, brush, location); 

在我们的例子中,这对徽标和照片很好,因为它们是左对齐的。 您需要做的就是测量位置并创建位置点。 确保以正确的大小和分辨率创建图像, 或者调整dpi以弥补不同的像素大小!

更新:我已经包含了调整照片dpi代码,使宽度适合模板中的30mm框架。 这假设比例是正确的和/或我们更关心宽度而不是高度。如果我们需要匹配两者,要么得到正确的比例要么是要求裁剪代码;-)

测量其余的项目有点复杂,因为它们都是正确对齐的。 以下是如何为字符串txt1执行此操作的示例:

 SizeF s1 = G.MeasureString(txt1, font1, PointF.Empty, StringFormat.GenericTypographic); G.DrawString(txt1, font1, brush1, new Point((int)(rightBorder - s1.Width), y1)); 

您可以(并且必须)测量每个位置的顶部( Y ),但左侧( X )必须像上面那样计算!

请注意,您需要告诉测量命令您要使用的字体; 忽略其他参数! 测量右边界后,这些命令将与必要的数据和图形对象一起正常工作。

  1. 从数据库中提取数据。 我想你可以做到! 我进一步假设您可以更改和扩展下面的代码来填充数据字段并使filename与您的记录动态化。

4和5。 看到这个代码示例:


  private void Button_Click(object sender, EventArgs e) { string FontFamily = "Verdana"; string fileName = "d:\\template.png"; Size keyCardSize = new Size (1004, 638); // 170x108mm float Dpi = 150f; Bitmap bmp = new Bitmap(keyCardSize.Width, keyCardSize.Height); bmp.SetResolution(Dpi, Dpi); // test data: Bitmap photo = new Bitmap(@"D:\scrape\sousers\SOU_JonSkeet.jpeg"); // I have measured the photo should be 30mm wide // so with 25.4mm to the inch we calculate a fitting dpi for it: float photoDpi = photo.Width * 25.4f / 30f; photo.SetResolution(photoDpi , photoDpi ); Font font1 = new Font(FontFamily, 23f); Font font2 = new Font(FontFamily, 12f); Font font3 = new Font(FontFamily, 14f); using (Graphics G = Graphics.FromImage(bmp)) using (SolidBrush brush1 = new SolidBrush(Color.MediumVioletRed)) using (SolidBrush brush2 = new SolidBrush(Color.Gray)) { G.Clear(Color.White); G.InterpolationMode = InterpolationMode.HighQualityBicubic; G.PageUnit = GraphicsUnit.Millimeter; G.SmoothingMode = SmoothingMode.HighQuality; StringFormat sf = StringFormat.GenericTypographic; int lBorder= 10; int rBorder= 160; int y1 = 10; int y2 = 25; //.. int y4 = 60; //.. //G.DrawImage(logo, imgLoc1); G.DrawImage(photo, new Point(lBorder, y4)); //G.DrawImage(img3, imgLoc3); //G.DrawImage(img4, imgLoc4); //G.DrawImage(img5, imgLoc5); // test data: string txt1 = "Jon Skeet"; string txt2 = "C Sharp Evangelist"; //.. SizeF s1 = G.MeasureString(txt1, font1, PointF.Empty, sf); SizeF s2 = G.MeasureString(txt2, font2, PointF.Empty, sf); //.. G.DrawString(txt1, font1, brush1, new Point((int)(rBorder- s1.Width), y1)); G.DrawString(txt2, font2, brush2, new Point((int)(rBorder- s2.Width), y2)); //G.DrawString(txt3, font2, brush2, txtLoc3); //.. //G.DrawString(txt7, font3, brush2, txtLoc7); G.FillRectangle(brush1, new RectangleF(rBorder - 1.5f, 52f, 1.5f, 46f)); } bmp.Save(fileName, ImageFormat.Png); font1.Dispose(); font2.Dispose(); font3.Dispose(); photo.Dispose(); //.. } 

我希望这能让你前进。 如果您有任何疑问,请随时询问..

以下是基本结果:

在此处输入图像描述

事后的想法:您可能希望通过使用模板作为开始来简化整个代码:您可以将徽标,图标和垂直条都放在适当的位置,只需要绘制一个图像和文本……!

好吧,只是一个想法可能不起作用,但我想我会抛出一些东西可能有所帮助!

如何创建一个像你说的那样循环数据库的程序。 但是对于Staff卡,创建一个像GraphicsBox一样的用户界面,以及一些文本框; 在Ui上创建/使用打印function,使窗口无边框以进行打印输出。

我不确定这是否会起作用,因为我使用C ++并且从未真正想过做这样的事情,但是我从头脑中得到了这个以前你永远都不知道!

但是,你显然会打印到我认为的高质量塑料,或者它是否被层压? 这不是真正重要的只是感兴趣:)