奇葩的世界奇葩的规定奇葩的需求,居然在交换完电子合同后,要求加盖骑缝章!!!我了了个去,开搞!
看了一下客户的PDF合同,秒懂了需求,顺手查看了一下网上的代码,支离破碎。
算了,还是亲自上手吧,这个世界破破烂烂,总要有人修修补补。
前提:你已经有了Aspose.pdf, 也有了公章的png图片,假设为496像素,正方形。
话不多说上核心代码(此方法不需要在服务器存储众多的切割完成的图片及保存的临时pdf文件):
1、根据PDF页数分割印章图片
public static MemoryStream[] GetImage(int num, string imageUrl)
{
MemoryStream[] imageStreams = new MemoryStream[num];
Image image = Image.FromFile(imageUrl);
int w = image.Width / num;
for (int i = 0; i < num; i++)
{
Bitmap bitmap = new Bitmap(w, image.Height);
using (Graphics g = Graphics.FromImage(bitmap))
{
g.Clear(System.Drawing.Color.White);
Rectangle rect = new Rectangle(i * w, 0, w, image.Height);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), rect, GraphicsUnit.Pixel);
}
bitmap.MakeTransparent(System.Drawing.Color.Transparent);//设置背景透明
var stream = new MemoryStream();
bitmap.Save(stream, ImageFormat.Png);
imageStreams[i] = stream;
}
return imageStreams;
}
2、盖章过程
protected void Button1_Click(object sender, EventArgs e)
{
string pdfPath = @"C:\UploadFiles\input.pdf"; //将要盖章的pdf文件
string picurl = @"C:\UploadFiles\gz.png"; //公章png文件
// 加载PDF文件
Aspose.Pdf.Document pdfDocument = new Aspose.Pdf.Document(pdfPath);
//获取分割后的印章图片
MemoryStream[] images = GetImage(pdfDocument.Pages.Count, picurl);
for (int i = 1; i <= pdfDocument.Pages.Count; i++)
{
Aspose.Pdf.Page page = pdfDocument.Pages[i];
// 创建骑缝章
ImageStamp imageStamp = new ImageStamp(images[i - 1])
{
Background = false,
Width = (496 / pdfDocument.Pages.Count)/4,
Height = 494/4,
XIndent = 660 - (496 / pdfDocument.Pages.Count), // 调整X坐标位置
YIndent = 300 // 调整Y坐标位置
};
page.AddStamp(imageStamp);
}
// 保存结果
pdfDocument.Save(@"C:\UploadFiles\包含骑缝章文件.pdf");
}
注:以上文件路径根据实际情况自行修改。