pdf中的标题设计问题

时间:2016-11-25 09:38:27

标签: c# itext

我希望标题看起来像这些红色矩形,但我的代码显示它重叠,如下图所示。 是安排标题的任何其他解决方案

enter image description here

我的代码是

 for (int i = 1; i <= pages; i++)
                {
                    string header = Convert.ToString(Session["Header"]);                       
                    float marginLR = 36;
                    float marginB = 2;
                    float footerHeight = 10;
                    Rectangle pagesize = reader.GetCropBox(i);
                    if (pagesize == null)
                    {
                        pagesize = reader.GetPageSize(i);
                    }
                    Rectangle rect = new Rectangle(
                            pagesize.Left + marginLR, pagesize.Top + marginB,
                            pagesize.Right - marginLR, pagesize.Top + marginB + footerHeight
                        );



                    // Phrase ft = new Phrase(footer, blackFont);
                    float marginLR2 = 36;
                    float marginB2 = 2;
                    float footerHeight2 = 10;

                     Rectangle rect2 = new Rectangle(60, 60, 810, 810);

                    image.SetAbsolutePosition(rect.Left, rect.Top - image.ScaledHeight);
                    var pdfContentByte = stamper.GetOverContent(i);
                    image.ScaleAbsoluteHeight(54f);
                    image.ScaleAbsoluteWidth(84f);
                    pdfContentByte.AddImage(image);
                    inputImageStream.Seek(0L, SeekOrigin.Begin);
                    ColumnText ct = new ColumnText(stamper.GetUnderContent(i));
                    ct.SetSimpleColumn(rect2);
                    ct.AddElement(new Paragraph(header));
                    ct.Go();

1 个答案:

答案 0 :(得分:1)

  

我希望标题看起来像这些红色矩形,但我的代码显示它重叠

您的代码显示重叠,因为您使用的坐标范围似乎已选择重叠

您可以在此处设置图像最左侧的 x 坐标

image.SetAbsolutePosition(rect.Left, rect.Top - image.ScaledHeight);
根据

rect.Left

Rectangle rect = new Rectangle(
    pagesize.Left + marginLR, pagesize.Top + marginB,
    pagesize.Right - marginLR, pagesize.Top + marginB + footerHeight
);

pagesize.Left + marginLR。您的问题没有说明pagesize.Left是什么,所以让我们为它假设非常常见的值0。然后由于

float marginLR = 36;

图像最左边的 x 坐标为36。

您可以在此处缩放图像

image.ScaleAbsoluteWidth(84f);

宽度为84.因此,图像最右边的 x 坐标为36 + 84 = 120。

文本的最左侧 x 坐标设置在此处

ct.SetSimpleColumn(rect2);

到该矩形的最左侧 x 坐标,该矩形定义为

Rectangle rect2 = new Rectangle(60, 60, 810, 810);

因此,文本最左边的 x 坐标是60。

因此,您选择的图像跨越 x 坐标(从36到120),文本跨越 x 坐标从60开始。根据您的代码,因此,您希望图像和文本重叠!

作为旁注,您将图片添加到OverContent,文字添加到UnderContent,因此您特别希望图片覆盖文字。

如果您实际上不希望这种重叠,那么您选择了不合适的坐标。

由于图像的宽度似乎与那些红色矩形的宽度相匹配,因此其 x 坐标似乎是正确的。因此,您应该将rect2定义更正为最左边的 x 坐标,该坐标比最右边的图像x坐标120稍大,例如, 136:

Rectangle rect2 = new Rectangle(136, 60, 810, 810);
顺便说一下,文本最右边的 x 坐标在这里被选为810.这看起来非常错误,特别是与你的红色矩形不匹配......

您的 y 坐标也会被不恰当地选择。例如。设置图像位置时,请使用其ScaledHeight

image.SetAbsolutePosition(rect.Left, rect.Top - image.ScaledHeight);

但不久之后你重新缩放图像的高度

image.ScaleAbsoluteHeight(54f);

所以前者的计算是基于错误的高度。 *仅在完成缩放图像高度后才使用图像ScaledHeight。*

关于文本的上 y 坐标,您在rect2定义中明确选择它为810。如果您希望它开始更高,请使用更大的值。