生成员工卡
Generate Staff Card
我们公司要为我们的人员打印员工卡,所以我们准备了一个模板,其中包含每个人的照片、姓名和部门的占位符。
我们有一个数据库 table,其中包括每个人的照片路径、姓名和部门。
我想知道是否有可能遍历 table 并将人员数据添加到卡片模板中并保存。
我正在使用 C#.Net,但如果您因此知道更好的解决方案,我很乐意倾听。
好吧,只是一个想法可能行不通,但我想我会抛出一些东西可能会有所帮助!
你创建一个程序,按照你说的那样循环数据库怎么样?但是对于员工卡片,创建一个用户界面,例如 GraphicsBox 和一些文本框; Create/use Ui 上的打印功能,使 window 打印输出无边框。
我不确定这是否可行,因为我使用 C++,从未真正想过做这样的事情,但我从头到尾想到了这个,你永远不知道!
但是你显然会打印到我认为的高质量塑料上,或者它正在被层压?不是真的很重要只是感兴趣:)
使用 C# 和 GDI+ 完全没有问题
这是简短的版本:
- 创建尺寸和分辨率合适的
Bitmap
- 测量你想要的图片和文字的坐标
- 从您的数据库中提取数据
- 使用
Graphics.DrawImage
和Graphics.DrawString
创建图形
- 以您喜欢的格式保存,最好是
PNG
,因为这样可以使文本清晰
详情来了:
- 您需要计算您的图片应该有多少像素。由于您希望能够打印它,因此您应该至少使用 150dpi 或 200dpi。
您发布的图片没有 DPI 设置和 1004x638 像素;将其设置为 150dpi 会导致物理尺寸为 170x108 毫米。让我们假设这没问题..
因此我们使用这些参数创建位图:
Size keyCardSize = new Size (1004, 638);
float Dpi = 150f;
Bitmap bmp = new Bitmap(keyCardSize.Width, keyCardSize.Height);
bmp.SetResolution(Dpi, Dpi);
- 下面的代码将使用毫米作为单位。您可能想将其更改为其他内容。
查看您的模板,我们看到 6 个图像(徽标、照片和 4 个图标)和 7 个文本块(姓名、职位、部门和四个联系文本)。
用 Graphics G
绘制图像或文本的基本命令如下所示:
G.DrawImage(bitmap, location);
G.DrawString(text, font, brush, location);
在我们的例子中,这对徽标和照片来说效果很好,因为它们是左对齐的。您需要做的就是测量位置并创建定位点。请确保您以正确的大小和分辨率或创建图像,您调整 dpi 以弥补不同的像素大小!
更新: 我已经包含了调整照片 dpi
的代码,使 宽度 适合 30mm 框架模板。这假设比例是正确的 and/or 我们更关心宽度而不是高度。如果我们需要匹配两者,要么获得正确的比例,要么要求裁剪代码 ;-)
测量我们其余的项目有点复杂,因为它们都是右对齐的。这是一个如何为字符串 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
)!
注意,你需要告诉测量命令你想要使用的字体;忽略其他参数!测量右边界后,这些命令将适用于必要的数据和图形对象。
- 正在从您的数据库中提取数据。我想你可以做到!我进一步假设您可以更改和扩展下面的代码以填充数据字段并使
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();
//..
}
我希望这能让你继续下去。如果您有任何疑问,请随时提问..
这是初步结果:
事后思考:您可能希望以模板为起点来简化整个代码:您可以将徽标、图标和垂直条都放在适当的位置,只需要绘制一个图像和文本。 .!
我们公司要为我们的人员打印员工卡,所以我们准备了一个模板,其中包含每个人的照片、姓名和部门的占位符。
我们有一个数据库 table,其中包括每个人的照片路径、姓名和部门。
我想知道是否有可能遍历 table 并将人员数据添加到卡片模板中并保存。
我正在使用 C#.Net,但如果您因此知道更好的解决方案,我很乐意倾听。
好吧,只是一个想法可能行不通,但我想我会抛出一些东西可能会有所帮助!
你创建一个程序,按照你说的那样循环数据库怎么样?但是对于员工卡片,创建一个用户界面,例如 GraphicsBox 和一些文本框; Create/use Ui 上的打印功能,使 window 打印输出无边框。
我不确定这是否可行,因为我使用 C++,从未真正想过做这样的事情,但我从头到尾想到了这个,你永远不知道!
但是你显然会打印到我认为的高质量塑料上,或者它正在被层压?不是真的很重要只是感兴趣:)
使用 C# 和 GDI+ 完全没有问题
这是简短的版本:
- 创建尺寸和分辨率合适的
Bitmap
- 测量你想要的图片和文字的坐标
- 从您的数据库中提取数据
- 使用
Graphics.DrawImage
和Graphics.DrawString
创建图形 - 以您喜欢的格式保存,最好是
PNG
,因为这样可以使文本清晰
详情来了:
- 您需要计算您的图片应该有多少像素。由于您希望能够打印它,因此您应该至少使用 150dpi 或 200dpi。
您发布的图片没有 DPI 设置和 1004x638 像素;将其设置为 150dpi 会导致物理尺寸为 170x108 毫米。让我们假设这没问题..
因此我们使用这些参数创建位图:
Size keyCardSize = new Size (1004, 638);
float Dpi = 150f;
Bitmap bmp = new Bitmap(keyCardSize.Width, keyCardSize.Height);
bmp.SetResolution(Dpi, Dpi);
- 下面的代码将使用毫米作为单位。您可能想将其更改为其他内容。
查看您的模板,我们看到 6 个图像(徽标、照片和 4 个图标)和 7 个文本块(姓名、职位、部门和四个联系文本)。
用 Graphics G
绘制图像或文本的基本命令如下所示:
G.DrawImage(bitmap, location);
G.DrawString(text, font, brush, location);
在我们的例子中,这对徽标和照片来说效果很好,因为它们是左对齐的。您需要做的就是测量位置并创建定位点。请确保您以正确的大小和分辨率或创建图像,您调整 dpi 以弥补不同的像素大小!
更新: 我已经包含了调整照片 dpi
的代码,使 宽度 适合 30mm 框架模板。这假设比例是正确的 and/or 我们更关心宽度而不是高度。如果我们需要匹配两者,要么获得正确的比例,要么要求裁剪代码 ;-)
测量我们其余的项目有点复杂,因为它们都是右对齐的。这是一个如何为字符串 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
)!
注意,你需要告诉测量命令你想要使用的字体;忽略其他参数!测量右边界后,这些命令将适用于必要的数据和图形对象。
- 正在从您的数据库中提取数据。我想你可以做到!我进一步假设您可以更改和扩展下面的代码以填充数据字段并使
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();
//..
}
我希望这能让你继续下去。如果您有任何疑问,请随时提问..
这是初步结果:
事后思考:您可能希望以模板为起点来简化整个代码:您可以将徽标、图标和垂直条都放在适当的位置,只需要绘制一个图像和文本。 .!