C# 尝试添加水印时,iText7文档没有页面

C# 尝试添加水印时,iText7文档没有页面,c#,pdf,itext,itext7,watermark,C#,Pdf,Itext,Itext7,Watermark,我有一个pdf,它在iText之外的SSRS中呈现。该报告以单独的pdf格式提供,我使用iText应用一些进一步的功能,例如将pdf合并为一个,添加密码加密等 我试图在pdf的每一页上添加水印,如下所示: public string MergeReports(ConcurrentDictionary<int, string> base64Reports, string password = null, string watermark = null) { try {

我有一个pdf,它在iText之外的SSRS中呈现。该报告以单独的pdf格式提供,我使用iText应用一些进一步的功能,例如将pdf合并为一个,添加密码加密等

我试图在pdf的每一页上添加水印,如下所示:

public string MergeReports(ConcurrentDictionary<int, string> base64Reports, string password = null, string watermark = null)
{
    try
    {
        var passwordBytes = password != null ? Encoding.ASCII.GetBytes(password) : null;

        // Creating new PdfDocument with smart mode on which maintains formatting and styling.
        using (var ms = new MemoryStream())
        using (var mergedPdf = new PdfDocument(new PdfWriter(ms, 
            new WriterProperties().SetStandardEncryption(passwordBytes, passwordBytes, EncryptionConstants.ALLOW_PRINTING,
                EncryptionConstants.ENCRYPTION_AES_128 | EncryptionConstants.DO_NOT_ENCRYPT_METADATA)).SetSmartMode(true)))
        {
            foreach (var report in base64Reports.OrderBy(x => x.Key))
            {
                var (_, base64String) = report;
                var bytes = Convert.FromBase64String(base64String);

                using (var memoryStream = new MemoryStream(bytes))
                {
                    using (PdfReader reader = new PdfReader(memoryStream))
                    {
                        using (var pdfDoc = new PdfDocument(reader))
                        {
                            if (watermark != null)
                                AddWatermark(watermark, pdfDoc);

                            pdfDoc.CopyPagesTo(1, pdfDoc.GetNumberOfPages(), mergedPdf);
                            pdfDoc.Close();
                        }
                    }
                }
            }
            
            mergedPdf.Close();

            return Convert.ToBase64String(ms.ToArray());
        }
    }
    catch (Exception ex)
    {
        throw new PdfException($"Unable to merge PDF reports: {ex.Message}");
    }
}
公共字符串合并报告(ConcurrentDictionary Base64报告,字符串密码=null,字符串水印=null)
{
尝试
{
var passwordBytes=password!=null?Encoding.ASCII.GetBytes(password):null;
//使用智能模式创建新的PdfDocument,在智能模式下保持格式和样式设置。
使用(var ms=new MemoryStream())
使用(var mergedPdf=新的PDF文档,
新建WriterProperties()。设置标准加密(passwordBytes、passwordBytes、EncryptionConstants.ALLOW_PRINTING,
EncryptionConstants.ENCRYPTION_AES_128 | EncryptionConstants.DO_NOT_ENCRYPT_METADATA)).SetSmartMode(true)))
{
foreach(base64Reports.OrderBy(x=>x.Key)中的var报告)
{
var(u,base64String)=报告;
var bytes=Convert.FromBase64String(base64String);
使用(var memoryStream=新的memoryStream(字节))
{
使用(PdfReader reader=新PdfReader(memoryStream))
{
使用(var pdfDoc=新的PdfDocument(读卡器))
{
如果(水印!=null)
添加水印(水印,pdfDoc);
pdfDoc.CopyPagesTo(1,pdfDoc.GetNumberOfPages(),mergedPdf);
pdfDoc.Close();
}
}
}
}
mergedPdf.Close();
返回Convert.tobase64字符串(ms.ToArray());
}
}
捕获(例外情况除外)
{
抛出新的PDFEException($“无法合并PDF报告:{ex.Message}”);
}
}
private void AddWatermark(字符串水印,PdfDocument pdfDoc)
{
浮动水印修剪矩形宽度=300;
浮动水印修剪矩形高度=300;
浮动宽度=300;
浮模高度=300;
float formXOffset=0;
float formYOffset=0;
浮点翻译=50;
浮动翻译=25;
双旋转Rads=Math.PI/3;
var fontProgram=fontprogrammfactory.CreateFont(_configuration.GetSection(“FontFiles”)[“Calibri”]);
PdfFont font=PdfFontFactory.CreateFont(fontProgram);
浮点数=150;
var numberOfPages=pdfDoc.GetNumberOfPages();
PdfPage page=null;

对于(var i=1;i您的问题中存在多个问题,但要通过添加水印来解决问题,您必须创建另一个
PdfWriter
,因为您正在编辑pdf:

using (var destMemoryStream = new MemoryStream())
{
    using (var memoryStream = new MemoryStream(bytes))
    {
        using (PdfReader reader = new PdfReader(memoryStream))
        {
            using (PdfWriter pdfWriter = new PdfWriter(destMemoryStream))
            {
                using (var pdfDoc = new PdfDocument(reader, pdfWriter))
                {
                    if (watermark != null)
                        AddWatermark(watermark, pdfDoc);

                    pdfDoc.CopyPagesTo(1, pdfDoc.GetNumberOfPages(), mergedPdf);
                    pdfDoc.Close();
                }
            }
        }
    }
}

我不确定是否有必要在
AddWatermark
中调用
page?.Flush()
,以及合并是否有效。您正在尝试将pdf页面复制到空pdf文档。

是否有必要使用不同的dest内存流?我是否可以在
PdfWriter(memoryStream)中使用
memoryStream
@UsmanKhan对我来说,只使用一个PdfWriter和目标内存流是有意义的,但我没有测试它。我找到了答案,谢谢你的帮助。我使用了我为
mergedPdf
声明的
PdfWriter,并将调用移到了foreach之外的
AddWatermark
using (var destMemoryStream = new MemoryStream())
{
    using (var memoryStream = new MemoryStream(bytes))
    {
        using (PdfReader reader = new PdfReader(memoryStream))
        {
            using (PdfWriter pdfWriter = new PdfWriter(destMemoryStream))
            {
                using (var pdfDoc = new PdfDocument(reader, pdfWriter))
                {
                    if (watermark != null)
                        AddWatermark(watermark, pdfDoc);

                    pdfDoc.CopyPagesTo(1, pdfDoc.GetNumberOfPages(), mergedPdf);
                    pdfDoc.Close();
                }
            }
        }
    }
}