现有pdf中的水印(文本或图像) [英] watermark (text or image) in existing pdf
本文介绍了现有pdf中的水印(文本或图像)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何在c#中的现有pdf中添加水印(文本或图像)?
How do I add a watermark (text or image) in an existing pdf in c#?
我希望为pdf的所有页面显示水印.
I want the watermark displayed for all pages of the pdf.
我尝试使用itextsharp,但水印仅显示在pdf的最后一页中.
I tried with itextsharp but the watermark is displaying in only last page of the pdf.
public void CreateTemplate(string watermarkText, string targetFileName)
{
var document = new Document();
var pdfWriter = PdfWriter.GetInstance(document, new FileStream(targetFileName, FileMode.Create));
var font = new iTextSharp.text.Font(iTextSharp.text.Font.HELVETICA, 60, iTextSharp.text.Font.NORMAL, iTextSharp.text.Color.LIGHT_GRAY);
document.Open();
ColumnText.ShowTextAligned(pdfWriter.DirectContent, Element.ALIGN_CENTER, new Phrase(watermarkText, font), 300, 400, 45);
document.Close();
}
public void AddTextWatermark(string sourceFilePath, string watermarkTemplatePath, string targetFilePath)
{
var pdfReaderSource = new PdfReader(sourceFilePath);
var pdfStamper = new PdfStamper(pdfReaderSource, new FileStream(targetFilePath, FileMode.Create));
var pdfReaderTemplate = new PdfReader(watermarkTemplatePath);
var page = pdfStamper.GetImportedPage(pdfReaderTemplate, 1);
for (var i = 0; i < pdfReaderSource.NumberOfPages; i++)
{
var content = pdfStamper.GetUnderContent(i + 1);
content.AddTemplate(page, 0, 0);
}
pdfStamper.Close();
pdfReaderTemplate.Close();
}
推荐答案
The following is inspired by 'iText in Action - 2nd Edition' by Bruno Lowagie. I am using iTextSharp version 5.4.
下面的代码将文本水印和透明图像水印添加到现有的pdf中.评论中的详细信息...
The code below adds both a text watermark and a transparent image watermark to an existing pdf. Details in comments...
public interface IWriter { void Write(Stream stream); }
public class TextAndImageWatermarker : IWriter
{
public readonly string INPUT_PDF = "the_pdf_you_are_watermarking";
// inner class for text watermark
class TextWatermarkPdfPageEventHelper : PdfPageEventHelper
{
static readonly Font FONT = new Font(Font.FontFamily.HELVETICA, 40, Font.NORMAL, new GrayColor(0.75f));
// write text SW to NE for odd pages, NW to SE for even pages
public override void OnEndPage(PdfWriter writer, Document document)
{
ColumnText.ShowTextAligned(
writer.DirectContentUnder,
Element.ALIGN_CENTER, new Phrase("watermark (text or image) in existing pdf", FONT),
300, 400, writer.PageNumber % 2 == 1 ? 60 : -60
);
}
}
// inner class for image watermark
class ImageWatermarkPdfPageEventHelper : PdfPageEventHelper
{
// the image you use as a watermark
static readonly Image img = null;
public override void OnEndPage(PdfWriter writer, Document document)
{
img.SetAbsolutePosition(
(document.PageSize.Width - img.ScaledWidth) / 4,
(document.PageSize.Height - img.ScaledHeight) / 4
);
writer.DirectContentUnder.SaveState();
writer.DirectContentUnder.SetGState(new PdfGState() { FillOpacity = 0.5f });
writer.DirectContentUnder.AddImage(img, true);
writer.DirectContentUnder.RestoreState();
}
}
public void Write(Stream stream)
{
var reader = new PdfReader(INPUT_PDF);
using (reader)
{
using (Document document = new Document())
{
// trick is to use page events
PdfWriter writer = PdfWriter.GetInstance(document, stream);
writer.PageEvent = new TextWatermarkPdfPageEventHelper();
writer.PageEvent = new ImageWatermarkPdfPageEventHelper();
document.Open();
var n = reader.NumberOfPages;
// dump pages from source, watermarks will be added OnEndPage
for (int i = 1; i <= n; i++)
{
document.NewPage();
var pagei = writer.GetImportedPage(reader, i);
writer.DirectContentUnder.AddTemplate(pagei, 0, 0);
}
}
}
}
}
这篇关于现有pdf中的水印(文本或图像)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文