2012-01-31 3 views
0

Я создал документ PDF с изображениями, я пытаюсь добавить текст под каждым изображением, помните, что шаблон для страницы отличается в зависимости от того, сколько изображений пользователь хочет на странице , Моя проблема заключается в том, что у меня возникают проблемы с добавлением и позицией текста.Добавление текста в 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

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

Если бы я угадал, одна из ваших проблем заключается в том, что текст на самом деле не отображается в ваших 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(); 
+0

Спасибо Крис, я нашел другое решение, использующее PDFContentByte для отображения и расположить текст. Как правило, вы правы на решение проблемы, поэтому я угадываю ваше право на это тоже! Если мне придется пересмотреть эту часть моего кода, я попробую ваши предложения. – DaNet

Смежные вопросы