使用PdfFormXObject定位画布和图像

时间:2019-05-15 22:28:09

标签: c# itext itext7

我使用PdfFormXObject而不是PdfCanvas来将背景,边框和/或背景色应用于页面的特定区域(主要是因为PdfCanvas需要Page来构造, PdfFormXObject不是。因为我的内容可能持续数页)。问题是,如果坐标(x = 0,y = 0)表示左下角,则图像的位置不符合预期。我也想将Canvas定位到固定位置,但是canvas.SetFixedPosition()似乎不起作用。请参阅所附的原始图像以及要放置在{x,y,宽度,高度} = {100f,100f,200f,200f}的图像,该图像应位于页面底部(不是),并且以某种方式被截断了吗?

  1. 代码

    public void CreatePDF(string path)
    {
           var writer = new PdfWriter(path);
           var pdf = new PdfDocument(writer);
           var doc = new Document(pdf, PageSize.LETTER);
           doc.SetMargins(18, 18, 18, 18);
           var rect = new Rectangle(100f, 100f, 200f, 200f);
           var temp = new PdfFormXObject(new Rectangle(rect.GetWidth(), rect.GetHeight()));
           var ca = new Canvas(temp, pdf);
           // ca.SetFixedPosition(rect.GetLeft(), rect.GetBottom(), rect.GetWidth());
           var img = new Image(ImageDataFactory.Create(path));
           img.SetFixedPosition(rect.GetLeft(), rect.GetBottom());
           img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight());
           ca.Add(img);
           ca.SetBackgroundColor(ColorConstants.BLUE); // not shown blue bg
           ca.Close();
           doc.Add(new Image(temp));
           doc.Close();
           pdf.Close();
    }
    
  2. 原始图片 enter image description here

  3. 生成一个(错误放置在顶部) enter image description here

  4. 更新 这是mkl指示之后的工作代码。但是画布无法设置边框/背景色:


       public void CreatePDF(string path)
       {
                var writer = new PdfWriter(path);
                var pdf = new PdfDocument(writer);
                var doc = new Document(pdf, PageSize.LETTER);
                doc.SetMargins(LETTER_MARGIN, LETTER_MARGIN, LETTER_MARGIN, LETTER_MARGIN);
                var rect = new Rectangle(100f, 300f, 200f, 200f);
                var w = Doc.GetPageEffectiveArea(PageSize.LETTER).GetWidth(); //576f
                var h = Doc.GetPageEffectiveArea(PageSize.LETTER).GetHeight();//756f
                var temp = new PdfFormXObject(new Rectangle(w, h));
                var ca = new Canvas(temp, pdf);

                ca.SetFixedPosition(0, 0, 576f);
                ca.SetBorder(new SolidBorder(1f));//not work
                ca.SetBackgroundColor(ColorConstants.BLUE);//not work

                var img = new Image(ImageDataFactory.Create(path));

                img.SetFixedPosition(rect.GetLeft(), rect.GetBottom());
                img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight());
                ca.Add(img);

                ca.Close();
                doc.Add(new Image(temp));

                doc.Close();
                pdf.Close();
     }

  1. 更新 我在ca上添加了Div,并为Div设置了边框和背景色。完美运行。

TIA

1 个答案:

答案 0 :(得分:0)

首先,使用仅为以下对象定义宽度和高度的矩形创建PdfFormXObject

var temp = new PdfFormXObject(new Rectangle(rect.GetWidth(), rect.GetHeight()));

因此,该矩形在xobject坐标系形式的原点具有左下角,即左下角为(0,0),右上角为(200,200)。

在此区域,您将200×200的图像放置在(100,100):

img.SetFixedPosition(rect.GetLeft(), rect.GetBottom());
img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight());
ca.Add(img);

因此,大多数图像在xobject外部,只有左下象限在内部,即您在屏幕快照中看到的象限。

然后将这个xobject添加到文档中而不进行定位:

doc.Add(new Image(temp));

因此,您要求itext将200×200 xobject放置在适合现有内容的位置。因此它将比您想要的更远。

因此,要解决问题,请布置xobject区域和图像位置,以使图像位于该区域中,然后根据需要定位xobject。