当前位置: 首页 > 知识库问答 >
问题:

使用PdfFormXObject定位画布和图像

萧宁
2023-03-14

我正在使用PDFFormxObject而不是PDFCanvas将背景、边框和/或背景色应用到页面的某个区域(主要是因为PDFCanvas需要页面来构建,而PDFFormxObject不需要。因为我的内容可能会持续几页)。问题是,如果坐标(x=0,y=0)意味着左下角,则图像的位置不会像预期的那样。我还想将画布定位到一个固定的位置,但是Canvas.setFixedPosition()似乎不起作用。请参阅附上的原始图像和要定位在{x,y,width,height}={100f,100f,200f,200f}的图像,该图像应该在页面的底部(不是),它也被截断了?

>

  • 代码

    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();
    }
    

    更新这里是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();
         }
    
    

    TIA

  • 共有1个答案

    曹光霁
    2023-03-14

    首先,使用只定义宽度和高度的矩形创建PDFFormxObject:

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

    因此,矩形在form 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添加到文档中,而不进行定位:

    doc.Add(new Image(temp));
    

    因此,您要求itext将200×200xobject放置在给定现有内容的位置。所以它的位置会比你想要的更高。

    因此,要解决您的问题,请安排xobject区域和图像位置,使图像位于该区域中,并根据需要定位xobject。

     类似资料:
    • 我在FrameLayout中的SurfaceView画布上画线。我从相机预览中接收图像,对其进行处理,获取矩形的坐标并在画布上绘制线条。绘制时,我得到这些线在y轴上的位移,线越低,位移越大(见下面的照片): 用红线标记(使用Paint程序,而不是实际的应用程序)下线坐标坐标在位图上的大致位置,矩形的下部绿线(由实际的应用程序放置,在画布上绘制)以及红线显示,坐标移位了多少。顶部的坐标不能穿过屏幕,

    • 显示网格 若要在图表画布启用网格,从菜单栏选择“图表”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“图表”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat Data Modeler 使用的默认符号样式。 简单 一个简单的符号样式。表、视图或实体

    • 显示网格 若要在图表画布启用网格,从菜单栏选择“查看”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“查看”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat Data Modeler 使用的默认符号样式。 简单 一个简单的符号样式。表、视图或实体

    • 显示网格 若要在图表画布启用网格,从菜单栏选择“查看”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“查看”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat 使用的默认符号样式。 简单 一个简单的符号样式。表或视图只显示名。 IE (Crow's

    • 显示网格 若要在图表画布启用网格,从菜单栏选择“图表”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“图表”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat 使用的默认符号样式。 简单 一个简单的符号样式。表或视图只显示名。 IDEF1X ICA

    • 显示网格 若要在图表画布启用网格,从菜单栏选择“查看”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“查看”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat 使用的默认符号样式。 简单 一个简单的符号样式。表或视图只显示名。 IE (Crow's