C# 尝试添加水印时,iText7文档没有页面
我有一个pdf,它在iText之外的SSRS中呈现。该报告以单独的pdf格式提供,我使用iText应用一些进一步的功能,例如将pdf合并为一个,添加密码加密等 我试图在pdf的每一页上添加水印,如下所示: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 {
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();
}
}
}
}
}