110,534
社区成员
发帖
与我相关
我的任务
分享
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
namespace AddWaterMark
{
class Program
{
private static readonly string connectionString = "";
private static readonly string workPath = @"";
static void Main(string[] args)
{
PdfDocument document = new PdfDocument();
string jobName;
DataRow[] rows;
string sql = "SELECT filename FROM WaterMark";
DataTable dataTable = DBHelper.ExecuteDataTable(connectionString, CommandType.Text, sql, null);
var dicFileList = GetFiles(workPath);
foreach (KeyValuePair<string, string> kv in dicFileList)
{
//如果数据库中不存在此条记录则表示未添加
rows = dataTable.Select("filename='" + kv.Key + "'");
if (rows.Length == 0)
{
try
{
jobName = kv.Key;
//添加水印
document.LoadFromFile(jobName);
if (!AddMarkSuccessed(document, jobName))
continue;
document.SaveToFile(destFile);
document.Dispose();
//添加成功后保存到数据库中
sql = $@"INSERT INTO WaterMark(filename,updatetime) VALUES ('{jobName}','{DateTime.Now}')";
DBHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql, null);
}
catch (Exception)
{
}
}
}
}
private static bool AddMarkSuccessed(PdfDocument doc, string jobName)
{
try
{
float x = 160;
float y = 10;
for (int i = 0; i < doc.Pages.Count; i++)
{
//删除旧的图层
doc.Pages[i].PageLayers.DeleteOldLayer("WaterMark");
//添加新的图层
PdfFont font = new PdfFont(PdfFontFamily.TimesRoman, 30f, PdfFontStyle.Italic | PdfFontStyle.Bold);
PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Center);
PdfPageLayer layer = doc.Pages[i].PageLayers.Add("WaterMark", true);
layer.Graphics.SetTransparency(0.3f);
layer.Graphics.DrawString(jobName, font, PdfBrushes.Red, x, y, format);
}
return true;
}
catch (Exception)
{
return false;
}
}
}
}
document.Dispose();
到底干什么,其实谁也不知道。只不过有人会抠字眼儿来说“释放”,但是释放了什么我相信这些人也说不出来。
其它代码也不知到哪里有所谓内存泄漏问题。
所以这个问题其实还没有任何测试基础。还是无厘头的。既然代码这么简单,那么从经验上看,最容易出错的地方就是自以为能“更快”所以滥用了(相对于 foreach 语句来说的)全局的 PdfDocument 对象。PdfDocument document = new PdfDocument();
放到 foreach 循环里边吧。
放到外边,你以为“速度快了”,实际上快多多少?有多大价值?你应该测试一下。反而是乱用(相对foreach语句块来说)全局变量,存在着风险。