Растянуть водяной знак снизу слева на верх справа на PDF c# - PullRequest
0 голосов
/ 14 января 2020

это может звучать как очень простой вопрос, но я не могу понять это.

Я хочу поместить водяной знак поверх моего PDF и хочу, чтобы он начинался в левом нижнем углу и конец в верхнем правом углу. Моя начальная проблема в том, что я не могу найти левый нижний угол. У меня сложилось впечатление, что в зависимости от документа PDF, который я открываю, координаты 0,0 меняются.

Это то, что я получил до сих пор:

 static string fontname = "Calibri";
        public void WaterMarkPDF3(string sourceFileName)
        {
            PdfDocument doc = PdfReader.Open(sourceFileName, PdfDocumentOpenMode.Modify);

            foreach (PdfPage page in doc.Pages)
            {
                //First calculate the cross angle from bottom left to top right
                double Angle= -Math.Atan(page.Height / page.Width) * 180 / Math.PI;

                //here I calculate how long the diagonal is so that my string can have the same length
                double watermarkWidth = page.Height / Math.Sin(Angle);

                XGraphics gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Prepend);

                double emSize = 300;
                XFont font = new XFont(fontname, emSize, XFontStyle.Bold);
                XSize size = gfx.MeasureString("Teststring", font);

                gfx.TranslateTransform(page.Width / 2, page.Height / 2);

                gfx.RotateTransform(Angle);
                gfx.TranslateTransform(-page.Width / 2, -page.Height / 2);

                XGraphicsPath path = new XGraphicsPath();

                path.AddString("Teststring", font.FontFamily, XFontStyle.Bold, emSize,
                new XPoint(0, page.Height), XStringFormats.Default);

                // add to color to the outline and filling
                XPen pen = new XPen(XColor.FromArgb(75, 0, 152, 163), 2);
                XBrush brush = new XSolidBrush(XColor.FromArgb(50, 0, 152, 163));

                gfx.DrawPath(pen, brush, path);

            }
            doc.Save(sourceFileName);
        }

По тому, что я понимаю 0,0 будет верхний левый угол. Обычно, если я начну свой водяной знак в new XPoint(0, page.Height), я ожидаю, что он будет внизу слева. Как вы можете видеть на прилагаемом рисунке, он расположен в «случайном» месте.

code result

Ответы [ 2 ]

0 голосов
/ 15 января 2020

спасибо всем за помощь.

Я изменил свой текст на изображение (компания lo go). код теперь работает для всех типов страниц (A4, A3, ....)

Код ниже:

public void WaterMarkPDF4(string sourceFileName)
        {
            PdfDocument doc = PdfReader.Open(sourceFileName, PdfDocumentOpenMode.Modify);

            foreach (PdfPage page in doc.Pages)
            {
                double hoek = Math.Atan(page.Height / page.Width);
                double watermarkWidth = page.Height / Math.Sin(hoek);


                XGraphics gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Append);
                XImage image = XImage.FromFile(TransparentImage.png");

                double iWidth = image.PixelWidth * 72 / image.HorizontalResolution;
                double iHeight = image.PixelHeight * 72 / image.HorizontalResolution;
                double factor = watermarkWidth * 0.8 / iWidth;

                XPoint punt = new XPoint();
                punt.X = iWidth / 2;
                punt.Y = iHeight / 2;

                gfx.TranslateTransform(-iWidth / 2, -iHeight / 2);
                gfx.RotateAtTransform(-hoek * 180 / Math.PI, punt);
                gfx.ScaleAtTransform(factor,factor, iWidth / 2, iHeight / 2);


                double pwidth = page.Width;
                double pheight = page.Height;

                double dx = Math.Cos(hoek) * pwidth / 2 - Math.Sin(hoek) * pheight / 2;
                double dy = Math.Sin(hoek) * pwidth / 2 + Math.Cos(hoek) * pheight / 2;

                double newHeight = (image.PixelHeight / page.Width) * watermarkWidth;
                double y = page.Height/2  - newHeight / 2;


                gfx.DrawImage(image, dx/factor, dy/factor);

                gfx.Dispose();


            }
            doc.Save(sourceFileName);

        }
0 голосов
/ 15 января 2020

Образец водяного знака можно найти здесь:
https://github.com/empira/PDFsharp-samples/blob/master/samples/core/Watermark/Program.cs

Одно отличие между образцом и вашим кодом - XStringFormat. Это определяет, как строка выравнивается относительно заданной точки. В примере просто выравнивается центр строки по центру страницы.

Ваш «вопрос» из комментариев: emSize - это размер шрифта в пунктах - 72 точки - 1 дюйм. Ваши 300 точек составляют 105,833 мм или 4,167 дюйма.

Ваш фрагмент кода вращается вокруг центра страницы. Я предполагаю, что это также меняет координаты угла страницы. Если вы хотите начать строку с угла страницы, то, вероятно, проще повернуть за угол страницы.
Пример dr aws водяного знака в центре страницы, и это то, что большинство людей попросит.

...