/// <summary> /// 將 PDF 加上 浮水印 /// </summary> /// <param name="pdfStream"></param> /// <param name="arg"></param> /// <returns></returns> public static MemoryStream AddWatermark(MemoryStream pdfStream, WatermarkArg arg) { var pdfDocument = new Aspose.Pdf.Document(pdfStream); if (!string.IsNullOrWhiteSpace(arg.Watermark)) { var text = new FormattedText(arg.Watermark); foreach (var page in pdfDocument.Pages) { switch (arg.WMStyle) { case WatermarkStyle.FitPage: AddWatermarkFitPage(page, arg); break; case WatermarkStyle.RepeatHorizontal: AddWatermarkRepeatHorizontal(page, arg); break; default: break; } } } var newPdfStream = new MemoryStream(); pdfDocument.Save(newPdfStream); return(newPdfStream); }
protected void btnFooter_Click(object sender, EventArgs e) { var excelArg = new ExportDataTable2ExcelArg { dataSource = GetDataSource(), HeaderCenter = "&24 This is Report Header ...", HeaderRight = $"&12 使用者:Rainmaker\r日期:{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}", FooterRight = "&10 &P/&N", ColumnInfos = new Dictionary <string, Tuple <string, double, Aspose.Cells.Style> > { { "ProductID", new Tuple <string, double, Aspose.Cells.Style>($"產品代號", -1, null) }, { "ProductName", new Tuple <string, double, Aspose.Cells.Style>("產品名稱", -1, null) }, { "ProductDesc", new Tuple <string, double, Aspose.Cells.Style>("產品描述", -1, null) }, { "Units", new Tuple <string, double, Aspose.Cells.Style>("產品 庫存", -1, null) }, { "CreDte", new Tuple <string, double, Aspose.Cells.Style>("日期", 10, new Aspose.Cells.Style { Number = 14 }) } }, PageOrientation = PageOrientationType.Landscape, IsTextWrapped = false, PageScale = 80, FontName = "標楷體", HeaderHorizontalAlignment = TextAlignmentType.Center }; var pdfStream = GenPDFFromDataTable(excelArg); var fileNameWithoutExt = $"{Guid.NewGuid().ToString("N")}"; //string pdfFileName = Path.Combine(Server.MapPath("./data"), $"{fileNameWithoutExt}_temp.pdf"); //using (FileStream file = new FileStream(pdfFileName, FileMode.Create, System.IO.FileAccess.Write)) // pdfStream.CopyTo(file); var watermarkArg = new WatermarkArg { Watermark = $"* 使用者:亂馬客 *{Environment.NewLine}{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}", WMStyle = WatermarkStyle.RepeatHorizontal, WatermarkHeight = 100, WatermarkWidth = 130, WatermarkHorizontalSpace = 50, WatermarkVerticalSpace = 30, RotateAngle = 30, Opacity = .1 }; var waterStream = AddFooterAndWatermark(pdfStream, watermarkArg); //string watermarkFileName = Path.Combine(Server.MapPath("./data"), $"{fileNameWithoutExt}.pdf"); //using (FileStream file = new FileStream(watermarkFileName, FileMode.Create, System.IO.FileAccess.Write)) // waterStream.CopyTo(file); Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment; filename=" + $"{fileNameWithoutExt}.pdf"); var fileSize = waterStream.Length; byte[] pdfBuffer = new byte[(int)fileSize]; waterStream.Read(pdfBuffer, 0, (int)fileSize); waterStream.Close(); Response.BinaryWrite(pdfBuffer); Response.End(); }
public static MemoryStream AddFooterAndWatermark(MemoryStream pdfStream, WatermarkArg arg) { var pdfDocument = new Aspose.Pdf.Document(pdfStream); var pdfLastPage = pdfDocument.Pages[pdfDocument.Pages.Count]; var footer = new Aspose.Pdf.HeaderFooter(); //Instantiate a table object Aspose.Pdf.Table tab1 = new Aspose.Pdf.Table(); tab1.HorizontalAlignment = HorizontalAlignment.Center; //設定預設的文字格式 var defaultTextState = new TextState("MingLiU", 8); footer.Paragraphs.Add(tab1); tab1.DefaultColumnWidth = "180"; tab1.DefaultCellTextState = defaultTextState; //Create rows in the table and then cells in the rows var row1 = tab1.Rows.Add(); var cellL = row1.Cells.Add("信用資訊查詢主管"); //cellL.DefaultCellTextState = defaultTextState; cellL.Alignment = HorizontalAlignment.Left; var cellR = row1.Cells.Add("經辦"); cellR.Alignment = HorizontalAlignment.Right; pdfLastPage.Footer = footer; if (!string.IsNullOrWhiteSpace(arg.Watermark)) { var text = new FormattedText(arg.Watermark); foreach (var page in pdfDocument.Pages) { switch (arg.WMStyle) { case WatermarkStyle.FitPage: AddWatermarkFitPage(page, arg); break; case WatermarkStyle.RepeatHorizontal: AddWatermarkRepeatHorizontal(page, arg); break; default: break; } } } var newPdfStream = new MemoryStream(); pdfDocument.Save(newPdfStream); return(newPdfStream); }
/// <summary> /// 浮水印跟頁面一樣大 /// </summary> /// <param name="pdfPage"></param> /// <param name="arg"></param> private static void AddWatermarkFitPage(Aspose.Pdf.Page pdfPage, WatermarkArg arg) { //var text = new FormattedText(arg.Watermark); var defaultTextState = new TextState("MingLiU"); var stamp = new TextStamp(arg.Watermark, defaultTextState); stamp.RotateAngle = arg.RotateAngle; stamp.XIndent = arg.WatermarkHorizontalSpace; stamp.YIndent = arg.WatermarkVerticalSpace; stamp.Opacity = arg.Opacity; stamp.Width = pdfPage.CropBox.Width; stamp.Height = pdfPage.CropBox.Height; pdfPage.AddStamp(stamp); }
/// <summary> /// 依 浮水印 水平地蓋滿整個頁面 /// </summary> /// <param name="pdfPage"></param> /// <param name="arg"></param> private static void AddWatermarkRepeatHorizontal(Aspose.Pdf.Page pdfPage, WatermarkArg arg) { if (arg.WatermarkHeight < minValue) { throw new ArgumentException($"{nameof(arg.WatermarkHeight)} must greater than {minValue}"); } if (arg.WatermarkWidth < minValue) { throw new ArgumentException($"{nameof(arg.WatermarkWidth)} must greater than {minValue}"); } //var text = new FormattedText(arg.Watermark); var yIndent = pdfPage.CropBox.Height - arg.WatermarkHeight; var yLimit = 0 - (arg.WatermarkHeight + arg.WatermarkVerticalSpace); var pageWidth = pdfPage.CropBox.Width; var xIndent = 0d; while (yIndent > yLimit) { while (xIndent < pageWidth) { var defaultTextState = new TextState("MingLiU"); var stamp = new TextStamp(arg.Watermark, defaultTextState); stamp.RotateAngle = arg.RotateAngle; stamp.XIndent = xIndent; stamp.YIndent = yIndent; stamp.Opacity = arg.Opacity; stamp.Width = arg.WatermarkWidth; stamp.Height = arg.WatermarkHeight; pdfPage.AddStamp(stamp); xIndent += (arg.WatermarkWidth + arg.WatermarkHorizontalSpace); } xIndent = 0; var yIdentReduce = (arg.WatermarkHeight + arg.WatermarkVerticalSpace); yIndent -= yIdentReduce; } }
/// <summary> /// 以角度線性期function來呈現 /// </summary> /// <param name="pdfPage"></param> /// <param name="arg"></param> private static void AddWatermarkRepeatRotateAngle(Aspose.Pdf.Page pdfPage, WatermarkArg arg) { if (arg.WatermarkHeight < minValue) { throw new ArgumentException($"{nameof(arg.WatermarkHeight)} must greater than {minValue}"); } if (arg.WatermarkWidth < minValue) { throw new ArgumentException($"{nameof(arg.WatermarkWidth)} must greater than {minValue}"); } var text = new FormattedText(arg.Watermark); var yIndent = pdfPage.CropBox.Height - arg.WatermarkHeight; var yLimit = 0 - (arg.WatermarkHeight + arg.WatermarkVerticalSpace); var pageWidth = pdfPage.CropBox.Width; var pageHeight = pdfPage.CropBox.Height; var xIndent = 0d; while (yIndent > yLimit) { var y = yIndent; while (xIndent < pageWidth && y < pageHeight) { var stamp = new TextStamp(text); stamp.RotateAngle = arg.RotateAngle; stamp.XIndent = xIndent; stamp.YIndent = y; stamp.Opacity = arg.Opacity; stamp.Width = arg.WatermarkWidth; stamp.Height = arg.WatermarkHeight; pdfPage.AddStamp(stamp); xIndent += (arg.WatermarkWidth + arg.WatermarkHorizontalSpace); xIndent = xIndent + Math.Cos(30) * arg.WatermarkWidth; y = y + Math.Sign(30) * (arg.WatermarkHeight + arg.WatermarkVerticalSpace); } xIndent = 0; var yIdentReduce = (arg.WatermarkHeight + arg.WatermarkVerticalSpace); yIndent -= yIdentReduce; } //到底了,要再連走 X var baseX = 0d; while (baseX < pageWidth) { var y = yIndent; xIndent = baseX; while (xIndent < pageWidth) { var stamp = new TextStamp(text); stamp.RotateAngle = arg.RotateAngle; stamp.XIndent = xIndent; stamp.YIndent = y; stamp.Opacity = arg.Opacity; stamp.Width = arg.WatermarkWidth; stamp.Height = arg.WatermarkHeight; pdfPage.AddStamp(stamp); xIndent += (arg.WatermarkWidth + arg.WatermarkHorizontalSpace); xIndent = xIndent + Math.Cos(30) * arg.WatermarkWidth; y = y + Math.Sign(30) * (arg.WatermarkHeight + arg.WatermarkVerticalSpace); } baseX += (arg.WatermarkWidth + arg.WatermarkHorizontalSpace);; } }