Как использовать объекты PDF Sharp в моем документе Migradoc - PullRequest
1 голос
/ 12 апреля 2019

У меня есть приложение, которое генерирует PDF-файлы с использованием платформы MigraDoc, однако у меня есть требование добавить текстовый водяной знак.Я нашел несколько примеров того, как это делается с использованием PDF Sharp здесь , однако я просто не могу понять, как это будет интегрировано с моим объектом Migradoc Document(), который я рендерим.

У меня есть следующий код:

    public byte[] render()
    {
        PdfDocument document = new PdfDocument();
        CreateWaterMarks(document);

        // *****************************

        PdfDocumentRenderer renderer = new PdfDocumentRenderer(true);
        renderer.Document = this.document;
        renderer.RenderDocument();

        byte[] pdfContents = null;
        using (MemoryStream stream = new MemoryStream())
        {
            renderer.PdfDocument.Save(stream, true);
            pdfContents = stream.ToArray();
        }

        return pdfContents;
    }

Этот метод вызывается для визуализации документа MigraDoc и передачи его в виде байтового массива.Вторая строка кода здесь вызывает следующий метод, который не выполняет то, что я ищу:

    void CreateWaterMarks(PdfDocument document)
    {
        PdfPage page = document.AddPage();
        Document doc = this.document;

        MigraDoc.Rendering.DocumentRenderer docRenderer = new DocumentRenderer(doc);
        docRenderer.PrepareDocument();

        XRect A4Rect = new XRect(0, 0, pageActiveWidth, pageActiveHeight);

        int pageCount = docRenderer.FormattedDocument.PageCount;
        for (int idx = 0; idx < pageCount; idx++)
        {
            XFont font = new XFont("Verdana", 13, XFontStyle.Bold);
            XGraphics gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Prepend);

            XSize size = gfx.MeasureString("Watermark", font);

            gfx.TranslateTransform(pageActiveWidth / 2, pageActiveHeight / 2);
            gfx.RotateTransform(-Math.Atan(pageActiveHeight / pageActiveWidth) * 180 / Math.PI);
            gfx.TranslateTransform(-pageActiveWidth / 2, -pageActiveHeight / 2);

            XStringFormat format = new XStringFormat();
            format.Alignment = XStringAlignment.Near;
            format.LineAlignment = XLineAlignment.Near;

            XBrush brush = new XSolidBrush(XColor.FromArgb(128, 255, 0, 0));

            gfx.DrawString("Watermark", font, brush, new XPoint((pageActiveWidth - size.Width) / 2, (pageActiveHeight - size.Height) / 2), format);

            docRenderer.RenderPage(gfx, idx + 1);
        }
    }

Я надеялся, что это волшебным образом заставит эти водяные знаки PDFSharp появляться, но, увы, я ничего не получу!

1 Ответ

0 голосов
/ 12 апреля 2019

У меня это работает, используя следующий код:

    public byte[] render()
    {
        PdfDocumentRenderer renderer = new PdfDocumentRenderer(true);
        renderer.Document = this.document;

        renderer.RenderDocument();
        renderer.PrepareRenderPages();

        CreateWatermarks(renderer);

        byte[] pdfContents = null;
        using (MemoryStream stream = new MemoryStream())
        {
            renderer.PdfDocument.Save(stream, true);
            pdfContents = stream.ToArray();
        }

        return pdfContents;
    }

    private void CreateWatermarks(PdfDocumentRenderer renderer)
    {
        int pages = renderer.DocumentRenderer.FormattedDocument.PageCount;
        for (int i = 0; i < pages; ++i)
        {
            var page = renderer.PdfDocument.Pages[i];

            XFont font = new XFont("Verdana", 27, XFontStyle.Bold);
            XGraphics gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Prepend);

            XSize size = gfx.MeasureString("Watermark", font);

            gfx.TranslateTransform(pageActiveWidth / 2, pageActiveHeight / 2);
            gfx.RotateTransform(-Math.Atan(pageActiveHeight / pageActiveWidth) * 180 / Math.PI);
            gfx.TranslateTransform(-pageActiveWidth / 2, -pageActiveHeight / 2);

            XStringFormat format = new XStringFormat();
            format.Alignment = XStringAlignment.Near;
            format.LineAlignment = XLineAlignment.Near;

            XBrush brush = new XSolidBrush(XColor.FromArgb(128, 255, 0, 0));

            gfx.DrawString("Watermark", font, brush, new XPoint((pageActiveWidth - size.Width) / 2, (pageActiveHeight - size.Height) / 2), format);

        }
    }
...