使用的技术
1.Apose.Cells 用于将Excel转化为PDF
2.Apose.Words 用于将Word转化为PDF
3.Itextsharp 用于在PDF上面添加水印
代码
public WaterResult pdfWatermark(string fileUrl, string fileNameAll, string watermark1, string watermark2,string watermark3, int fontSize1 = 40, int fontSize2 = 20)
{
HttpWebRequest fileRequest = WebRequest.Create(fileUrl) as HttpWebRequest;
HttpWebResponse fileResponse = fileRequest.GetResponse() as HttpWebResponse;
Stream fileStream = fileResponse.GetResponseStream();
WaterResult waterResult = new WaterResult();
//获取根目录
string mainURL = AppDomain.CurrentDomain.BaseDirectory;
//判断路径是否存在
if (!Directory.Exists($@"{mainURL}\PdfFile\"))
{
Directory.CreateDirectory($@"{mainURL}\PdfFile\");
}
//文件名称不带后缀
string fileName = Path.GetFileNameWithoutExtension(fileNameAll);
//时间和Guid
string time = DateTime.Now.ToString("yyyyMMdd") + "-" + Guid.NewGuid();
//后缀
string fileSuffix = Path.GetExtension(fileNameAll);
//默认后缀
string pdfSuffix = ".pdf";
//临时路径
string onePath = string.Empty;
//文件流
//Stream fileStream = null;
//Stream fileLastStream = null;
if (fileSuffix == ".docx" || fileSuffix == ".doc")
{
onePath = $@"{mainURL}\PdfFile\Word{fileName}{pdfSuffix}";
//格式转换
MemoryStream ms = StreamToMemoryStream(fileStream);
Aspose.Words.Document doc = new Aspose.Words.Document(ms);
doc.Save(onePath, Aspose.Words.SaveFormat.Pdf);
//开启文件流
fileStream = new FileStream(onePath, FileMode.OpenOrCreate);
}
else if (fileSuffix == ".xlsx" || fileSuffix == ".xls")
{
onePath = $@"{mainURL}\PdfFile\Excel{fileName}{pdfSuffix}";
//格式转换
MemoryStream ms = StreamToMemoryStream(fileStream);
Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook(ms);
wb.Save(onePath, Aspose.Cells.SaveFormat.Pdf);
//开启文件流
fileStream = new FileStream(onePath, FileMode.OpenOrCreate);
}
else
{
if (fileSuffix != ".pdf")
{
waterResult.susses = false;
waterResult.filePath = string.Empty;
waterResult.msg= $"{fileSuffix}格式的文件暂不予处理";
return waterResult;
}
}
//格式为pdf的文件开启文件流
//if(fileStream == null)fileStream = new FileStream(filePath, FileMode.OpenOrCreate);
//文件名(全)
fileName = fileName + pdfSuffix;
//最后保存路径
var tempPath = $@"{mainURL}\PdfFile\{fileName}";
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
try
{
//实例化itextSharp
pdfReader = new PdfReader(fileStream);
pdfStamper = new PdfStamper(pdfReader, new FileStream(tempPath, FileMode.OpenOrCreate));
//总页数
int total = pdfReader.NumberOfPages + 1;
iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);
float width = psize.Width;
float height = psize.Height;
PdfContentByte content;
// 中文适配
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//设置字体,需要有字体文件,网上自行下载
BaseFont font = BaseFont.CreateFont($@"{mainURL}\Font\STChangmou_XM.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
PdfGState gs = new PdfGState();
for (int i = 1; i < total; i++)
{
content = pdfStamper.GetOverContent(i);//在内容上方加水印
//content = pdfStamper.GetUnderContent(i);//在内容下方加水印
//透明度
gs.FillOpacity = 0.4f;
content.SetGState(gs);
//content.SetGrayFill(0.3f);
//开始写入文本
content.BeginText();
content.SetColorFill(BaseColor.GRAY);
content.SetTextMatrix(0, 0);
if (!string.IsNullOrEmpty(watermark1))
{
content.SetFontAndSize(font, fontSize1);
content.ShowTextAligned(Element.ALIGN_CENTER, watermark1, width / 2, height / 4+50, 38);
content.SetFontAndSize(font, fontSize1);
content.ShowTextAligned(Element.ALIGN_CENTER, watermark1, width / 2, height / 4*3 + 50-(height/10), 38);
}
if (!string.IsNullOrEmpty(watermark2))
{
content.SetFontAndSize(font, fontSize1);
content.ShowTextAligned(Element.ALIGN_CENTER, watermark2, width / 2, height / 4-50, 38);
content.SetFontAndSize(font, fontSize1);
content.ShowTextAligned(Element.ALIGN_CENTER, watermark2, width / 2, height / 4 * 3 - 50-(height / 10), 38);
}
if (!string.IsNullOrEmpty(watermark3))
{
content.SetFontAndSize(font, fontSize2);
content.ShowTextAligned(Element.ALIGN_CENTER, watermark3, width - 100, 10, 0);
}
content.EndText();
}
waterResult.susses = true;
waterResult.filePath = tempPath;
waterResult.msg = $"水印添加成功";
return waterResult;
}
catch (Exception ex)
{
waterResult.susses = false;
waterResult.filePath = string.Empty;
waterResult.msg = $"水印添加失败";
return waterResult;
}
finally
{
if (pdfStamper != null) pdfStamper.Close();
if (pdfReader != null) pdfReader.Close();
if (fileStream != null) fileStream.Close();
//if (fileLastStream != null) fileLastStream.Close();
if (!string.IsNullOrEmpty(onePath)) File.Delete(onePath);
conn.Logout();
//if (!string.IsNullOrEmpty(tempPath)) File.Delete(tempPath);
}
}
//文件流转内存流
public static MemoryStream StreamToMemoryStream(Stream stream)
{
MemoryStream memoryStream = new MemoryStream();
//将基础流写入内存流
const int bufferLength = 1024;
byte[] buffer = new byte[bufferLength];
int actual = stream.Read(buffer, 0, bufferLength);
while (actual > 0)
{
memoryStream.Write(buffer, 0, actual);
actual = stream.Read(buffer, 0, bufferLength);
}
memoryStream.Position = 0;
return memoryStream;
}
public class WaterResult
{
public bool susses { set; get; }
public string filePath { set; get; }
public string msg { set; get; }
}