【问题标题】:Watermark on a pdf gets set at the top left corner instead of center of the pagepdf上的水印设置在左上角而不是页面中心
【发布时间】:2016-12-26 08:27:16
【问题描述】:

我用来加水印的代码如下所示。对于前两页,水印显示正确,但对于第三页,水印显示在左上角。当我调试时,它显示的页面大小大约为 692*712。

class Program
{
    static string absoluteFile1Path = "filename1.pdf";
    static string absoluteFile2Path = "filename2.pdf";
    static string destination = "destinationfilename.pdf";

    static void Main(string[] args)
    {
        string[] filesPath = new string[] { absoluteFile1Path, absoluteFile2Path };

        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(destination));            

        PdfMerger merger = new PdfMerger(pdfDoc);

        PdfDocument srcDoc1 = new PdfDocument(new PdfReader(absoluteFile1Path));
        merger.Merge(srcDoc1, 1, srcDoc1.GetNumberOfPages());

        PdfDocument srcDoc2 = new PdfDocument(new PdfReader(absoluteFile2Path));
        merger.Merge(srcDoc2, 1, srcDoc2.GetNumberOfPages());

        pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, new WatermarkHandler());            

        srcDoc1.Close();
        srcDoc2.Close();

        pdfDoc.Close();

    }
}

public class WatermarkHandler : IEventHandler
{
    Color lime, blue;
    PdfFont helvetica;
    PdfFont font;

    public WatermarkHandler()
    {
        //helvetica = PdfFontFactory.CreateFont(FontConstants.HELVETICA);
        //lime = new DeviceCmyk(0.208f, 0, 0.584f, 0);
        //blue = new DeviceCmyk(0.445f, 0.0546f, 0, 0.0667f);
        font = PdfFontFactory.CreateFont(FontConstants.HELVETICA);
    }

    public void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;

        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        int pageNumber = pdf.GetPageNumber(page);
        Rectangle pageSize = page.GetPageSize();

        PdfCanvas canvas = new PdfCanvas(page.NewContentStreamAfter(), page.GetResources(), pdf);
        PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.9f).SetStrokeOpacity(0.3f);
        canvas.SetExtGState(gs1);
        new Canvas(canvas, pdf, new iText.Kernel.Geom.Rectangle(page.GetPageSize().GetWidth() / 2, page.GetPageSize().GetHeight() / 2))
                .SetFontColor(iText.Kernel.Colors.DeviceGray.LIGHT_GRAY)
                .SetFontSize(26)
                .SetFont(font)
                .ShowTextAligned(new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT"), 298, 375, pdf.GetPageNumber(page),
                        TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);

        canvas.Release();
    }
}
}

【问题讨论】:

  • 向我们展示 PDF。可能页面左下角的坐标与x = 0; y = 0 不同。您没有考虑到该偏移量。
  • 页面高度或页面宽度可能不能被 2 整除(即奇数)并导致问题?

标签: pdf watermark itext7


【解决方案1】:

没有看过 pdf 我无法确定,但这很可能是由于其中一页被旋转(如果您的第三页的宽度和高度翻转了 90 或 270 度),因此显示的绝对坐标旋转页面上的水印有点偏离。

您可以使用PdfPage#getRotation() 获取页面的旋转,并编写一些额外的逻辑来根据检索到的值计算旋转的 x 和 y。 There's some info on the coordinate system used in pdfs in chapter 2 of the iText7 jumpstart tutorial.

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 2020-05-01
    • 2015-05-07
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多