使用 PdfFormXObject 的位置 Canvas 和图像

Position Canvas and Image with PdfFormXObject

我使用 PdfFormXObject 而不是 PdfCanvas 来将背景、边框、and/or 背景色应用于页面的特定区域(主要是因为 PdfCanvas 需要要构建的页面,PdfFormXObject 不会。因为我的内容可能会持续几页)。问题是如果坐标 (x = 0, y = 0) 表示左下角,则图像未按预期定位。我也想将 Canvas 定位到固定位置,但 canvas.SetFixedPosition() 似乎不起作用。请参阅附加的原始图像和位于 {x, y, width, height} = {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. 原图

  3. 生成了一个(错误地放在了顶部)

  4. 更新 这是 mkl 指导后的工作代码。但是canvas无法设置border/background color:


       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

首先,您使用仅定义宽度和高度的矩形创建一个 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。