我已经可以为任何PDF添加水印,里面的图像,一切都好,但现在我需要水印只在PDF打印时出现......这可能吗?怎么样?
我当然需要以编程方式执行此操作。
答案 0 :(得分:8)
对于将来的读者,可以通过将水印包装在PDF layer(可选内容组)中,然后将此图层的 Usage 属性配置为仅打印来实现。有关详细信息,请参阅PDF Reference Document,第4章图形,部分4.10- 可选内容。
答案 1 :(得分:2)
具体来说,使用itextsharp,我能够使用以下内容,特别是 - pdf版本1.7和SetPrint(“Watermark”,true)
string oldfile = @"c:\temp\oldfile.pdf";
string newFile = @"c:\temp\newfile.pdf";
PdfReader pdfReaderS = new PdfReader(oldfile);
Document document = new Document(pdfReaderS.GetPageSizeWithRotation(1));
PdfWriter pdfWriterD = PdfWriter.GetInstance(document, new FileStream(newFile, FileMode.Create, FileAccess.Write));
pdfWriterD.SetPdfVersion(PdfWriter.PDF_VERSION_1_7);
document.Open();
PdfContentByte pdfContentByteD = pdfWriterD.DirectContent;
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
int n = pdfReaderS.NumberOfPages;
string text = "UNCONTROLLED";
for (int i = 1; i <= n; i++)
{
iTextSharp.text.Rectangle pageSizeS = pdfReaderS.GetPageSizeWithRotation(i);
float pageWidth = pageSizeS.Width / 2;
float pageheight = pageSizeS.Height / 2;
document.SetPageSize(pageSizeS);
document.NewPage();
PdfImportedPage pdfImportedPage = pdfWriterD.GetImportedPage(pdfReaderS, i);
PdfLayer layer1 = new PdfLayer("Watermark", pdfWriterD);
layer1.SetPrint("Watermark", true);
layer1.View = false;
layer1.On = false;
layer1.OnPanel = false;
pdfContentByteD.BeginLayer(layer1);
pdfContentByteD.SetColorFill(BaseColor.RED);
pdfContentByteD.SetFontAndSize(bf, 30);
ColumnText.ShowTextAligned(pdfContentByteD, Element.ALIGN_CENTER, new Phrase(text), 300, 700, 0);
pdfContentByteD.EndLayer();
pdfContentByteD.AddTemplate(pdfImportedPage, 0, 0);//, 0, 1, 0, 0);
}
document.Close();
pdfReaderS.Close();
答案 2 :(得分:1)
您可能应该利用屏幕使用RGB和打印机CMYK这一事实。您应该能够在CMYK中创建两种颜色,映射到相同的RGB值。对于一个坚定的专家来说,这当然是不够的。
答案 3 :(得分:0)
bOnScreen参数确定在计算机屏幕上查看PDF时是否显示水印,bOnPrint确定在打印PDF时是否显示水印。
- https://acrobatusers.com/tutorials/watermarking-a-pdf-with-javascript