在图像之后将文本添加到pdf

时间:2012-01-31 20:34:05

标签: c# pdf itextsharp

我创建了一个包含图片的PDF文档,我试图在每个图像下添加文本,请记住,页面的模板根据用户在页面上想要的图像数量而有所不同。我的问题是我在添加文本时遇到问题。

添加图片的代码:

int count = 0;

        imageStartX = (docSize.Width / 100) * marginSizeProcent;

        float imageMaxHeight = 0;
        float imageMaxWidth = 0;

        iTextSharp.text.Image image = null;

        switch (pageLayout)
        {
            case PageLayoutEnum.SingleImage:

                imageMaxWidth = docSize.Width - ((docSize.Width/100) * (2 * (float)marginSizeProcent));
                imageMaxHeight = imageStartY - ((docSize.Width/100) * (float)marginSizeProcent);


                foreach (PDFObject o in pdfObjects)
                {
                    if (count > 0)
                        AddPageWithHeader(false);

                    image = iTextSharp.text.Image.GetInstance(o.File);
                    image.ScaleToFit(imageMaxWidth, imageMaxHeight);
                    image.SetAbsolutePosition(imageStartX + (imageMaxWidth - image.ScaledWidth) / 2, imageStartY - image.ScaledHeight - (imageMaxHeight - image.ScaledHeight) / 2);

                    image.Border = Rectangle.BOX;
                    image.BorderWidth = 2f;
                    image.BorderColor = BaseColor.DARK_GRAY;

                    document.Add(image);

                    count++;
                }

                break;

            case PageLayoutEnum.TwoImages:

添加文字的代码:

MemoryStream memoryStream = new MemoryStream();

        PdfReader pdfReader = new PdfReader(documentStream.ToArray());
        PdfStamper stamper = new PdfStamper(pdfReader, memoryStream);

        PdfContentByte contentbyte = stamper.GetUnderContent(1);
        ColumnText dispalyIdText = new ColumnText(contentbyte);
        Paragraph idText;

        int counter = 0;

        switch (pageLayout)
        {
            case PageLayoutEnum.SingleImage:
                foreach (PDFObject item in pdfObjects)
                {
                    dispalyIdText.SetSimpleColumn(200, 200, 200, 200, 200, Element.ALIGN_LEFT);
                    idText = new Paragraph(new Chunk(item.DisplayId, FontFactory.GetFont("Arial", 20, Font.BOLD, BaseColor.RED)));
                    dispalyIdText.AddElement(idText);
                }
                break;

            case PageLayoutEnum.TwoImages:

1 个答案:

答案 0 :(得分:1)

你没有说出你的实际问题是什么,只是你拥有它们。

如果我猜测,您的一个问题是文本实际上并未显示在您的PDF上。这有三个不同的原因。第一个是这一行:

dispalyIdText.SetSimpleColumn(200, 200, 200, 200, 200, Element.ALIGN_LEFT);

此方法的前四个参数是要约束绘图的矩形的坐标。第一个参数是左下角x,第二个参数是左下角y,第三个参数是右上角x,第四个参数是右上角y。在您的代码中,您要将文本绑定到左下坐标为200,200且右上角为200,200的矩形。这意味着您的矩形的宽度和高度为零。要解决此问题,您需要提供一个实际可行的矩形。在PDF中,左下角是0,0,所以要在左下角的一个矩形中绘制文本,其中20像素(实际上不是像素,但那是另一个故事)高,200宽你'做:

dispalyIdText.SetSimpleColumn(0, 0, 200, 20, 200, Element.ALIGN_LEFT);

您的第二个问题是您将leading(行高)设置为200.根据您创建的对象,这可能会或可能不会将文本输出。你应该把它设置得更合理,可能是字体的高度。这不会影响AddElement,但会影响SetText

dispalyIdText.SetSimpleColumn(0, 0, 200, 20, 12, Element.ALIGN_LEFT);

最后一个问题是,当使用ColumnText时,您现在处于“文本”模式,并且必须在准备好开始处理时告诉系统。您可以通过发出Go()命令来执行此操作:

dispalyIdText.Go();