Как добавить водяной знак как текст на все страницы в PDF с помощью ABCpdf?
Я использую ABCpdf7 для создания PDF, где я в некоторых случаях хочу добавить текст, похожий на водяной знак, который будет отображаться на всех страницах документа. Всякий раз, когда я делаю текст уникальным на всех страницах, он работает как положено, но если это один и тот же текст на всех страницах, он игнорирует мое альфа-свойство.
Кажется, я не могу использовать objectID и ссылаться на то, что когда это не изображение, и поскольку файл pdf должен быть доступен на многих разных языках, я боюсь, что невозможно просто создать изображение с текстом и добавить его...,
Например, это работает:
theDoc.HPos = 0;
theDoc.VPos = 0;
theDoc.Rect.SetRect(250, 265, 500, 80);
theDoc.Transform.Rotate(55, 250, 265);
theDoc.FontSize = 72;
theDoc.Color.String = "0 0 0 a70";
Page[] pages = theDoc.ObjectSoup.Catalog.Pages.GetPageArray();
foreach (Page p in pages)
{
theDoc.Page = p.ID;
var dummy = theDoc.PageNumber.ToString();
theDoc.AddText("Unpublished" + dummy);
}
... но это не работает:
theDoc.HPos = 0;
theDoc.VPos = 0;
theDoc.Rect.SetRect(250, 265, 500, 80);
theDoc.Transform.Rotate(55, 250, 265);
theDoc.FontSize = 72;
theDoc.Color.String = "0 0 0 a70";
Page[] pages = theDoc.ObjectSoup.Catalog.Pages.GetPageArray();
foreach (Page p in pages)
{
theDoc.Page = p.ID;
theDoc.AddText("Unpublished");
}
Я чувствую, что упускаю что-то очень очевидное здесь, но не могу понять, что...
3 ответа
theDoc.Transform.Rotate(55, 250, 265);
эта строка должна вызываться один раз для первой страницы, иначе она будет вращаться для каждой страницы.
В этом случае я читаю файл pfd и создаю другой с водяным знаком.
BinaryWriter Writer = null;
string Name = Server.MapPath(@"~\ventas\" + id_uuid + ".pdf");
try
{
// Create a new stream to write to the file
Writer = new BinaryWriter(File.OpenWrite(Name));
// Writer raw data
Writer.Write(ArchivoDownload);
Writer.Flush();
Writer.Close();
}
catch { }
Doc theDoc = new Doc();
theDoc.Read(Name);
int theCount = theDoc.PageCount;
for (int i = 1; i <= theCount; i++)
{
theDoc.PageNumber = i;
theDoc.Pos.String = "23 456";
theDoc.FontSize = 90;
theDoc.HtmlOptions.HideBackground = true;
theDoc.TextStyle.CharSpacing = 5;
theDoc.Font = theDoc.AddFont("Helvetica");
theDoc.Color.Alpha = 255 / 10;
theDoc.Transform.Reset();
theDoc.Transform.Rotate(396, 302, 315);
theDoc.AddText("WaterMark");
}
theDoc.Save(Server.MapPath(@"~\ventas\" + id_uuid + "_c.pdf"));
theDoc.Clear();
Привет, я не уверен на 100%, полностью ли я понимаю проблему, но если это то, о чем я думаю, то это может помочь.
Вы удостоверились, что добавляете водяной знак последним для каждой страницы? У меня были проблемы с различной непрозрачностью при выполнении аналогичной операции, и все дело в том, что мой текст находился под некоторыми объектами на одной странице, а затем сверху на другой. Я создал метод в своей оболочке, который я мог просто вызывать последним на каждой странице, чтобы убедиться, что он помещен поверх всего остального на странице.
public void DrawWaterMark(double positionX = -55, double positionY = 130, string text = "APPROVED", double width = 260, double height = 90, TextAlign textAlign = TextAlign.Center, int colourR = 197, int colourG = 197, int colourB = 197, int fontSize = 95)
{
// Set text alignment:
switch (textAlign)
{
case TextAlign.Left:
PdfDocument.HPos = 0;
break;
case TextAlign.Center:
PdfDocument.HPos = 0.5;
break;
case TextAlign.Right:
PdfDocument.HPos = 1;
break;
}
// Set the text colour:
PdfDocument.Color.String = colourR + " " + colourG + " " + colourB;
SetFontSize(fontSize);
// Draw text:
PdfDocument.Transform.Rotate(45, (PdfDocument.MediaBox.Width / 2), (PdfDocument.MediaBox.Height / 2));
DrawHtmlString(positionX, positionY, width, height, "<b>" + text + "</b>", TextAlign.Center, colourR, colourG, colourB, 50);
PdfDocument.Transform.Rotate(-45, (PdfDocument.MediaBox.Width / 2), (PdfDocument.MediaBox.Height / 2));
SetFontSize(11);
}