【问题标题】:Trying to copy source pdf to destination at specific Y position尝试将源 pdf 复制到特定 Y 位置的目的地
【发布时间】:2019-08-01 21:03:04
【问题描述】:

我正在测试一种从名为 55PREMIUMPAYMENTWARRANTY.pdf 的现有 pdf 中读取的方法,该 pdf 顶部有几个小段落,每行 3 行。然后我尝试使用画布将其复制到不同 Y 位置的新文档。

我已经在不同位置的循环中调用了这个方法,并对结果感到惊讶。

Y位置通常从左下角的0开始,但如果Y值为负数,它只会在新页面上显示..这是为什么?

通常,如果我只是写纯文本,则 Y 值 400 大致位于 A4 页面的中间,即 595 x 842。

但是如果我想在中间显示它,我需要将 Y 设置为 -300 左右,这对我来说没有意义。

设置位置的线是 canvas.AddXObject(pageCopy, 0, position);

这是方法..

public static byte[] WritePPWToPosition(float position)
{
    try
    {
        //write PPW to different positions on the pdf

        var link = "D:\\Repo\\website3.0\\LeisureInsure\\Content\\CertificateDocuments\\55PREMIUMPAYMENTWARRANTY.pdf";
        byte[] buffer;
        using (Stream stream = new FileStream(@link, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            buffer = new byte[stream.Length - 1];
            stream.Read(buffer, 0, buffer.Length);
        }

        using (var ms = new MemoryStream())
        {                    
            //read source page
            var readerSource = new PdfReader(new MemoryStream(buffer));
            PdfDocument sourcePdf = new PdfDocument(readerSource);                                     
            PdfPage sourcePage = sourcePdf.GetPage(1);
            //create destination page
            PdfDocument newpdf = new PdfDocument(new PdfWriter(ms));
            PageSize a4Page = PageSize.A4;
            PdfPage newpage = newpdf.AddNewPage(a4Page);
            PdfCanvas canvas = new PdfCanvas(newpage);
            //copy source page to destination page
            PdfFormXObject pageCopy = sourcePage.CopyAsFormXObject(newpdf);                    
            //add destination page to canvas at position
            canvas.AddXObject(pageCopy, 0, position);
            sourcePdf.Close();
            newpdf.Close();

            var result = ms.ToArray();
            return result;
        }
    }
    catch (Exception ex)
    {
        throw;
    }
}

【问题讨论】:

    标签: c# itext itext7


    【解决方案1】:

    通常,如果我只是写纯文本,则 Y 值 400 大致位于 A4 页面的中间。

    但是如果我想在中间显示它,我需要将 Y 设置为 -300 左右,这对我来说没有意义。

    这其实很自然:

    • 如果要定位文本,则必须使用该文本的基线 开始位置的坐标。对于垂直居中的文本,它将位于页面区域内部的某处,明显高于页面底部。

    • 如果要定位表单 XObject,则必须使用该 XObject 的 左下角 所在位置的坐标。要在目标页面上的页面大小的表单 XObject 的顶部垂直居中内容,该左下角将位于页面区域下方的某处:

      显然,源页面的左下角应位于目标页面的底部下方。由于通常目标页面的坐标系的原点在其左下角,这意味着该位置的 y 坐标为负。


    严格来说,上面所说的是一种简化,因为通常您不会查看表单 XObject 的 左下角 应该去哪里,而是查看 origin 的位置XObject坐标系应该去。

    但如果是从某个源页面创建的表单 XObject,则原始页面的坐标系原点(通常在其左下角)成为 XObject 的原点。因此,通常上述说法是正确的。但是,对于通用解决方案,您必须考虑 XObject 边界框的实际值。

    【讨论】:

    • 确实,我以为我从文本开始的位置定位,我意识到它实际上只是使用 xobject 的左下角。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多