#c# #pdf #itext
#c# #PDF #itext
Вопрос:
У меня есть этот код, который добавит водяной знак на каждую страницу:
string watermarkLocation = AppDomain.CurrentDomain.BaseDirectory "Watermark.png";
Document document = new Document();
PdfReader pdfReader = new PdfReader(fileLocation);
PdfStamper stamp = new PdfStamper(pdfReader, new FileStream(fileLocation.Replace(".pdf", "_marked.pdf"), FileMode.Create));
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(watermarkLocation);
img.ScaleToFit(document.PageSize);
img.SetAbsolutePosition(0, 100);
PdfContentByte waterMark;
for (int page = 1; page <= pdfReader.NumberOfPages; page )
{
waterMark = stamp.GetOverContent(page);
waterMark.AddImage(img);
}
stamp.FormFlattening = true;
stamp.Close();
return fileLocation.Replace(".pdf", "_marked.pdf");
Но в PDF-файлах с текстовыми полями изображение будет находиться за текстовым полем / формой. Я думал, что выравнивание файла исправит это, но это не работает.
Я использовал полное изображение в качестве теста, но водяной знак в конце будет прозрачным.
Комментарии:
1. «думал, что сглаживание файла исправит это, но это не работает». — сглаживание исправит это, но вы должны сгладить в первом проходе и применить водяной знак во втором проходе.
2. @mkl Я добавил кодовое решение, но ваше предложение сработало. Я сглаживал его перед добавлением штампа, но у меня получилось создать отдельный штамп для сглаживания, а затем еще один для добавления водяного знака.
Ответ №1:
Вот окончательный код, который я использую. Как упоминалось в моем комментарии, в основном есть 2 считывателя / штампа, один для выравнивания файла, а другой для добавления водяного знака.
Сгладить файл:
private byte[] FlattenPdfFormToBytes(PdfReader reader)
{
var memStream = new MemoryStream();
var stamper = new PdfStamper(reader, memStream) { FormFlattening = true };
stamper.Close();
return memStream.ToArray();
}
Добавить водяной знак (который вызовет FlattenPdfFormToBytes):
public string AddWatermark(string fileLocation)
{
string watermarkLocation = AppDomain.CurrentDomain.BaseDirectory "Watermark.png";
Document document = new Document();
PdfReader pdfReader = new PdfReader(fileLocation);
PdfReader pdfFlatten = new PdfReader(FlattenPdfFormToBytes(pdfReader)); // The secret sauce is this!!!
PdfStamper stamp = new PdfStamper(pdfFlatten, new FileStream(fileLocation.Replace(".pdf", "_marked.pdf"), FileMode.Create));
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(watermarkLocation);
img.ScaleToFit(document.PageSize);
img.SetAbsolutePosition(0, 100);
PdfContentByte waterMark;
for (int page = 1; page <= pdfFlatten.NumberOfPages; page )
{
waterMark = stamp.GetOverContent(page);
waterMark.AddImage(img);
}
stamp.Close();
return fileLocation.Replace(".pdf", "_marked.pdf");
}