- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们公司要为我们的人员打印员工证,所以我们准备了一个模板,其中包含每个人的照片、姓名和部门的占位符。
我们有一个数据库表,其中包括每个人的照片路径、姓名和部门。
我想知道是否有可能遍历该表并将人员数据添加到卡片模板中并保存。
我正在使用 C#.Net,但如果您因此知道更好的解决方案,我很乐意倾听。
最佳答案
使用C#和GDI+完全没有问题
这是简短的版本:
位图
Graphics.DrawImage
和 Graphics.DrawString
创建图形PNG
,因为这样可以使文本保持清晰详情如下:
您发布的图像没有 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 个图像( Logo 、照片和 4 个图标)和 7 个文本 block (姓名、职位、部门和四个联系文本)。
使用 Graphics G
绘制图像或文本的基本命令如下所示:
G.DrawImage(bitmap, location);
G.DrawString(text, font, brush, location);
在我们的例子中,这对 Logo 和照片来说效果很好,因为它们是左对齐的。您需要做的就是测量位置并创建定位点。确保您或者以正确的尺寸和分辨率创建图像,或者您调整 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
)!
注意,你需要告诉测量命令你想要使用的字体;忽略其他参数!测量右边界后,这些命令将适用于必要的数据和图形对象。
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();
//..
}
我希望这能让你继续下去。如果您有任何疑问,请随时提问。
这是基本的结果:
事后思考:您可能想通过使用模板作为开始来简化整个代码:您可以将 Logo 、图标和垂直条都放在适当的位置,只需要绘制一个图像和文本..!
关于c# - 生成员工卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28560319/
我希望通过 Workday API 检索 Workday 工作人员(又名员工)Web 配置文件 URL。用例是我正在构建一个聊天机器人来检索用户信息,并且我希望能够深度链接到工作人员(员工)网络配置文
我很困惑我希望员工 ID 是自动生成的前缀格式我知道在 sql server 中触发之前是可能的我正在关注帖子 http://www.aspdotnet-suresh.com/2012/04/set-
我读了一个教程,其中有这个结构: struct { char Name[25]; int Age; float SkillRating; } Employee; defines
我有两个表 employee(name,id) ,其中包含所有员工和另一个表 reader(id,date) ,它给出了日期和哪个员工在场。我如何找到一定范围内的缺席者列表日期? 对于特定日期,我能够
我需要员工 ID 的标准正则表达式,例如 EMP015 015EMP EMP_015 E_015 EMP-015 EMP.VIS EMP/056 基本上它应该允许 . 或 _ 或 - 或 / 在字母数
我是 Angular 的新手,正在使用 Angular 编写代码,我正在观看视频教程。我注意到我的代码中有一些东西,但我无法理解它是如何工作的。 我想知道这段代码是什么意思组件上的“员工:员工 []”
下面从HR角度,来分析员工离职成本,欢迎大家留言讨论。 一个员工离职后留下的坑,并不是再找一个人填上就万事大吉了。 一般来说,核心人才的流失,至少有1-2个月的招聘期、3个月的适应期,6个月的融入期;
我有两个表 Employee 和 Department 此图像显示每个员工的经理。我想编写一个 SQL 查询,为我提供所有主管(经理、经理的经理......)的列表。 我只想要一个列,在给定特定员工时
我想将 ER 图的这一部分转换为关系模型。我们有一个三元关系,它说的是以下内容: 1 位客户将 1 个项目提供给 -> 多个开发人员 1 位客户分配给 1 位开发人员 -> 多个项目 1 个开发人员被
我将要开发一个应用程序,该应用程序将使用一些基于 SOAP 的 Web 服务框架。我做了一些研究,我有点喜欢 Axis2C 框架,但在某些主题中,我发现原来的 Axis2C 实现存在内存泄漏问题,并且
我的 SQL 数据库中有两个表: 公司: ID(自增) 姓名 地址 ... 员工: ID(自增) 公司编号 internal_id 姓名 姓氏 问题是我想要一个与他们所属的公司相关的员工 ID (in
我试图在堆栈溢出和谷歌上找到这个问题的答案,但没有找到。如果有问题需要更正或重复问题,请告诉我。 当我计算员工对象 (emp_obj) 和员工类的大小时,在这两种情况下我都得到了 4 个字节。但是我不
问题 如何在 Angular 员工 component.html 上返回 EmployeeCode ? 示例数据引用表 Code tableName FieldName LabelText
我是 hibernate 新手,正在使用 hibernate 版本 4.3.4 JAR 文件。我正在尝试使用 intelliJ 社区版中的 mySQL 服务器执行简单的 Hibernate 程序。以下
我正在使用 laravel 5.4 和 Yajra Datatable,但我无法使其工作..我遇到了“Uncaught TypeError: $(...).DataTable is not a fun
我想创建一个小型示例应用程序,它可以读取我的员工徽章并将其显示在屏幕上(或者如果我可以复制它就更好了,这样我们就可以使用我们的手机徽章而不是我们的塑料身份证) 几个问题1. 这在技术上可行吗?如果是这
我有一个 person 对象,需要将它存储为 byte[] 并再次检索该 byte[] 并转换为 person 对象 并且 BinaryFormatter 在 Silverlight 中不可用 最佳答
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
当我执行以下命令来创建分片时: mysqlfabric sharding add_table 1 employees.employees emp_no 我收到以下错误: DatabaseError:
这是我的表格 门票 tic_id, tic_cat tic_priority tic_cus tic_date tic_title tic_
我是一名优秀的程序员,十分优秀!