First, I’ll post the code I wrote, and then explain the issues at the end:
/// <summary>
/// 为pdf添加水印
/// </summary>
/// <param name="DocuementFileName">文档名称</param>
/// <param name="SaveFileName">保存后的名称</param>
/// <param name="WaterMarkContent">水印文本</param>
/// <param name="WaterMarkOpactiyNum">不透明度</param>
/// <param name="WaterMarkRotateDegNum">旋转角度</param>
/// <param name="WaterMarkHorAlign">水平对齐方式</param>
/// <param name="WaterMarkVerAlign">垂直对齐方式</param>
/// <param name="WaterMarkFontColor">字体颜色</param>
/// <param name="WaterMarkFontName">字体名称</param>
/// <param name="WaterMarkFontSize">字体大小</param>
public static void AddWaterMark2Pdf(
string DocuementFileName,
string SaveFileName,
string WaterMarkContent,
float WaterMarkOpactiyNum,
string WaterMarkRotateDegNum,
int WaterMarkHorAlignIndex,
int WaterMarkVerAlignIndex,
System.Drawing.Color WaterMarkFontColor,
string WaterMarkFontName = "宋体",
float WaterMarkFontSize = 12,
string AddImageFileName = "",
string AddImageHeight = "100",
string AddImageWidth = "100",
bool FullScreenMode = false,
int WaterDmi_Hor = 25,
int WaterDmi_Ver = 25,
bool CustomPostion = false,
double CustomPostion_X = 0,
double CustomPostion_Y = 0)
{
using Aspose.Pdf.Document TempLoadDocument = new Aspose.Pdf.Document(DocuementFileName);
#region foreach添加水印
foreach (Aspose.Pdf.Page TempPage in TempLoadDocument.Pages)
{
double PageWidth = TempPage.Rect.Width;
double PageHeight = TempPage.Rect.Height;
int PageRow = (int)(PageHeight / WaterDmi_Hor);
int PageCol = (int)(PageWidth / WaterDmi_Ver);
if (!string.IsNullOrEmpty(AddImageFileName))
{
lock (TempPage)
{
if (FullScreenMode)
{
for (int i = 0; i <= PageRow; i++)
{
for (int j = 0; j <= PageCol; j++)
{
WatermarkArtifact TempAddArtifact = new WatermarkArtifact();
TempAddArtifact.ArtifactHorizontalAlignment = GetHorizontalAlignment(
WaterMarkHorAlignIndex);
TempAddArtifact.ArtifactVerticalAlignment = GetVerticalAlignment(
WaterMarkVerAlignIndex);
TempAddArtifact.Rotation = Convert.ToInt32(WaterMarkRotateDegNum);
TempAddArtifact.Opacity = WaterMarkOpactiyNum;
TempAddArtifact.IsBackground = false;
TempAddArtifact.SetImage(AddImageFileName);
TempAddArtifact.Position = new Aspose.Pdf.Point(j * WaterDmi_Hor, i * WaterDmi_Ver);
lock (TempAddArtifact)
{
TempPage.Artifacts.Add(TempAddArtifact);
}
}
}
}
else
{
ImageStamp TempAddArtifact = new ImageStamp(AddImageFileName)
{
Opacity = WaterMarkOpactiyNum,
RotateAngle = Convert.ToInt32(WaterMarkRotateDegNum),
Width = double.Parse(AddImageWidth),
Height = double.Parse(AddImageHeight),
HorizontalAlignment = GetHorizontalAlignment(WaterMarkHorAlignIndex),
VerticalAlignment = GetVerticalAlignment(WaterMarkVerAlignIndex),
XIndent = 100,
YIndent = 100
};
TempPage.AddStamp(TempAddArtifact);
}
}
}
//text watermark
else
{
lock (TempPage)
{
WatermarkArtifact TempAddArtifact = new WatermarkArtifact();
TextState TempTextState = new TextState
{
Font = FontRepository.FindFont(WaterMarkFontName),
FontSize = WaterMarkFontSize,
ForegroundColor =
Aspose.Pdf.Color
.FromArgb(WaterMarkFontColor.R, WaterMarkFontColor.G, WaterMarkFontColor.B)
};
TempAddArtifact.SetTextAndState(WaterMarkContent, TempTextState);
TempAddArtifact.ArtifactHorizontalAlignment = GetHorizontalAlignment(WaterMarkHorAlignIndex);
TempAddArtifact.ArtifactVerticalAlignment = GetVerticalAlignment(WaterMarkVerAlignIndex);
TempAddArtifact.Rotation = Convert.ToInt32(WaterMarkRotateDegNum);
TempAddArtifact.Opacity = WaterMarkOpactiyNum;
TempAddArtifact.IsBackground = false;
if (CustomPostion)
{
TempAddArtifact.Position = new Aspose.Pdf.Point(CustomPostion_X, CustomPostion_Y);
}
lock (TempAddArtifact)
{
if (FullScreenMode)
{
for (int i = 0; i <= PageRow; i++)
{
for (int j = 0; j <= PageCol; j++)
{
TempAddArtifact.Position = new Aspose.Pdf.Point(
j * WaterDmi_Hor,
i * WaterDmi_Ver);
TempPage.Artifacts.Add(TempAddArtifact);
Debug.WriteLine($"已经添加第{i}行第{j}列的水印...");
}
}
}
else
{
TempPage.Artifacts.Add(TempAddArtifact);
}
}
}
}
}
#endregion
TempLoadDocument.Save(SaveFileName, Aspose.Pdf.SaveFormat.Pdf);
}
private static Aspose.Pdf.HorizontalAlignment GetHorizontalAlignment(int index)
{
return index switch
{
0 => Aspose.Pdf.HorizontalAlignment.None,
1 => Aspose.Pdf.HorizontalAlignment.Left,
2 => Aspose.Pdf.HorizontalAlignment.Center,
3 => Aspose.Pdf.HorizontalAlignment.Right,
4 => Aspose.Pdf.HorizontalAlignment.Justify,
5 => Aspose.Pdf.HorizontalAlignment.FullJustify,
_ => Aspose.Pdf.HorizontalAlignment.None,
};
}
private static Aspose.Pdf.VerticalAlignment GetVerticalAlignment(int index)
{
return index switch
{
0 => Aspose.Pdf.VerticalAlignment.None,
1 => Aspose.Pdf.VerticalAlignment.Top,
2 => Aspose.Pdf.VerticalAlignment.Center,
3 => Aspose.Pdf.VerticalAlignment.Bottom,
_ => Aspose.Pdf.VerticalAlignment.None,
};
}
First Issue:With version 24.9.0, the above code works for batch-adding multiple watermarks (specifically text watermarks). However, after upgrading to the latest version, it seems only one watermark is added—even for the same document. Could there be an issue with the code?
Second Issue: For PDFs exported from Word, the watermark transparency settings work fine. But for PDFs exported from CorelDRAW (CDR), the transparency doesn’t seem to take effect—even when set to 0.5, it appears fully opaque (as if it were 1.0). However, if I convert the CDR-generated PDF to Word and then back to PDF, the transparency behaves correctly. Could you help identify the problem?
Attached is a sample document related to the second issue, with notes on the export method:
Aspose.Pdf的问题文档.zip (2.0 MB)