Как добавить водяной знак как текст на все страницы в PDF с помощью ABCpdf? - PullRequest
0 голосов
/ 05 января 2011

Я использую 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 ]

0 голосов
/ 11 сентября 2015
theDoc.Transform.Rotate(55, 250, 265);

эта строка должна вызываться один раз для первой страницы, иначе она будет вращаться для каждой страницы.

0 голосов
/ 03 октября 2016

В этом случае я читаю файл 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();
0 голосов
/ 05 сентября 2011

Привет, я не уверен на 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);
    }
...