Aspose.Pdf添加水印的两个问题

首先,我先贴下我编写的代码,然后在末尾说明问题吧:

/// <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);
                        }
                    }
                }
                //没有图片就用文字水印
                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,
            };
        }

第一个问题:使用24.9.0版本可以用上述代码,批量添加多个水印,也就是文字水印那块,但是升级到了最新版本以后,好像就添加不了了,同一份文档都是只有一个水印了,是不是代码写的有问题?

第二个问题:对于使用word编辑导出的pdf文件,添加水印设置透明度是生效的,但是好像对于cdr导出的pdf,添加水印就是不起作用的,透明度设置到0.5看起来都像是为1的状态,将这个cdr的pdf转为word,重新转为pdf,透明度就正常了,帮忙看看是什么问题

这是第二个问题的相关文档附件,已标注说明由什么方式导出:
Aspose.Pdf的问题文档.zip (2.0 MB)

补充说明下,代码是在24.9.0的环境下运行的。

@jidesheng

您是否也尝试过 25.4 版本的 API?另外,由于您分享的代码使用了缺失值的变量,能否请您分享一个最简示例代码片段?您可以分享一个包含硬编码值的简单最简代码,以便我们在自己的环境中复现该问题并进行相应的解决。

这是我调用时候的参数,可以稍微参考下:

Util.AddWaterMark2Pdf(
    D:\桌面\新建文件夹\新建文件夹\夏夜里的荷花与星星 UID:543952950测试文档.pdf,//源文档
    D:\桌面\新建文件夹\新建文件夹\夏夜里的荷花与星星 UID:543952950测试文档.pdf,//目标文档
    2222,//文字水印内容
    0.5,//不透明度
    45,//水印角度
    2,//对齐方式-垂直的索引
    2,//对齐方式-横向的索引
    Color [Red],//字体颜色,c#自带的字体颜色,应该是color.red
    SimSun,//字体名称
    12,//字体大小
    ,//图片名称,这里只用了文字索引,所以是空值
    ,//图片高度,这里只用了文字索引,所以是空值
    ,//图片宽度,这里只用了文字索引,所以是空值
    False,//是否满屏水印
    25,//满屏水印横向密度
    25,//满屏水印纵向密度
    False,//是否自定义水印位置
    100,//自定义水印位置的x轴位置
    100,//自定义水印位置的y轴位置
    False,//是否使用文件名作为水印内容
    False//水印是否为background
);

这是代码调用时候的参数,空值用""替代即可,其他的根据注释设置内容输入对应的参数就行。

尝试过24.5的API,效果也是一样的

@jidesheng

很抱歉给您带来麻烦,这可能是系统或版本的问题。我们建议您尝试使用 25.4 版本,而不是 24.5 版本。您尝试过 25.4 版本吗?这是 API 的最新版本。

我说错了,就是用的25.4的API尝试过,也是一样的。

@jidesheng

我们已在内部问题跟踪系统中打开以下新工单,并将根据 Free Support Policies 中所述的条款提供修复。

问题 ID:PDFNET-59774

如果您需要优先支持,并可以直接联系我们的付费支持管理团队,您可以访问 Paid Support Services