すでに任意のPDFに透かしを入れることができ、中の画像はすべて問題ありませんが、PDFが印刷されたときにのみ透かしを表示する必要があります...これは可能ですか?どのように?
もちろん、これはプログラムで行う必要があります。
将来の読者のために、透かしをPDF レイヤー(オプションのコンテンツ グループ) にラップし、このレイヤーの使用属性を印刷専用として構成することで、これを行うことができます。詳細については、PDF リファレンス ドキュメントの第 4 章-グラフィックス、パート 4.10 -オプションのコンテンツを参照してください。
具体的には、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();
画面が RGB を使用し、プリンターが CMYK を使用しているという事実を利用する必要があります。同じ RGB 値にマッピングされる CMYK で 2 つの色を作成できるはずです。もちろん、これは断固たる専門家に対しては十分ではありません。