Itextsharp V 5.x: высота ячейки изображения в pdfptable - PullRequest
0 голосов
/ 15 августа 2011

Я создаю таблицу и добавляю в нее ячейки с текстовым или графическим содержимым.

var  pdfTable = new PdfPTable(2);
                nCell = new PdfPCell(new Phrase("A")) {HorizontalAlignment = 1};
                pdfTable.AddCell(nCell);
                pdfTable.AddCell("B");
                pdfTable.AddCell(qrImg);
                pdfTable.AddCell(image39);
                pdfTable.AddCell("C");
                pdfTable.AddCell("D");
                pdfTable.SpacingBefore = 20f;
                pdfTable.SpacingAfter = 30f;
                document.Add(pdfTable);

отображает 3 строки и отображает изображение в строке 2

если я добавлю ячейки, сначала создав объект pdfpcell:

 var cell = new PdfPCell(qrImg};
 pdfTable.AddCell(nCell);

видны только строки 1 и 3.

Если я добавлю свойство высоты в ячейку, изображение будет отображено.

мои вопросы (3, но связанные); нужно ли указывать высоту при добавлении ячейки с изображением (ячейки добавляются с текстовым содержимым - фраза повторно отображается правильно) Есть ли что-то, чего мне не хватает при создании новой ячейки, что мешает отображению изображений? я всегда должен использовать Addcell (изображение) при добавлении изображения?

Спасибо всем, Mar

1 Ответ

0 голосов
/ 15 августа 2011

Проще понять, что происходит, если вы просматриваете источник . Таблица в iText хранит свойство под названием DefaultCell, которое многократно используется снова и снова. Это делается для того, чтобы основные свойства ячейки сохранялись от ячейки к ячейке. Когда вы вызываете AddCell(Image), изображение DefaultCell устанавливается на изображение, затем добавляется в таблицу, и, наконец, изображение получает null'd out.

543     defaultCell.Image = image;
544     AddCell(defaultCell);
545     defaultCell.Image = null;

Конструктор PdfCell(Image) фактически вызывает внутреннюю перегрузку PdfPCell(Image, bool) и передает false в качестве второго параметра, fit. Вот условие конструктора при подгонке:

152     if (fit) {
153         this.image = image;
154         Padding = borderWidth / 2;
155     }
156     else {
157         column.AddText(this.phrase = new Phrase(new Chunk(image, 0, 0, true)));
158         Padding = 0;
159     }

Если вы передадите false для подгонки, что является значением по умолчанию, вы увидите, что изображение добавляется гораздо более сложным способом.

Таким образом, в принципе, вы можете добавить изображение тремя основными способами (хорошо, гораздо больше, если вы используете вложенные таблицы, фрагменты или фразы), первое ниже выбирает значения по умолчанию и, вероятно, то, что вы хотите. Второй более сырой, но приближает вас к тому, что вы, вероятно, хотите. Третий - самый грубый и предполагает, что вы знаете, что делаете.

var qrImg = iTextSharp.text.Image.GetInstance(sampleImage1);

//Use the DefaultCell, including any existing borders and padding
pdfTable.AddCell(qrImg);

//Brand new cell, includes some padding to get the image to fit
pdfTable.AddCell(new PdfPCell(qrImg, true));

//Brand new cell, image added as a Chunk within a Phrase
pdfTable.AddCell(new PdfPCell(qrImg));
...