尝试将源pdf复制到特定Y位置的目标位置

时间:2019-08-01 21:03:04

标签: c# itext itext7

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

我在具有不同位置的循环中调用了此方法,并对结果感到惊讶。

Y位置通常从左下角的0开始,但是如果Y值为负,则仅在新页面上显示。为什么?

通常,如果我只写纯文本,则Y值400大约在A4页面的中间,即595 x842。

但是在这里,如果我想在中间显示它,我需要将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;
    }
}

1 个答案:

答案 0 :(得分:0)

  

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

     

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

这实际上是很自然的:

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

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

    to put ... onto ..., you need to ...

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


严格来说,以上所述只是一种简化,因为通常您不会看到XObject形式的左下角应该去的地方,而是XObject的 origin 的去处。 XObject坐标系就可以了。

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