Добавление текста в PDF после изображения - PullRequest
0 голосов
/ 01 февраля 2012

Я создал 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 Ответ

1 голос
/ 01 февраля 2012

Вы не говорите о своих реальных проблемах, только о том, что они у вас есть.

Если бы я догадался, одна из ваших проблем заключается в том, что текст на самом деле не отображается в ваших 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 (line-height) на 200. В зависимости от объекта, который вы создаете, это может или не может привести к потере текста.Вы должны установить это на что-то более вменяемое, возможно, высоту шрифта.Это не влияет на AddElement, но влияет на SetText.

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

Последняя проблема заключается в том, что при использовании ColumnText вы сейчас находитесь в «текстовом» режиме и должны сообщить системе, когдаВы готовы начать обработку.Это можно сделать, введя команду Go():

dispalyIdText.Go();
...