Автоматическое изменение размера изображения в PdfPCell с помощью iTextSharp - PullRequest
10 голосов
/ 11 июня 2010

У меня странная проблема с изображениями в библиотеке iTextSharp. Я добавляю изображение в PdfPCell и по какой-то причине оно увеличивается. Как сохранить исходный размер?

Я думаю, что при печати изображения будут такими же, но разница в изображении такая же, как и в печатной версии. Необходимость вручную масштабировать изображение с помощью ScaleXXX, чтобы привести его в порядок, кажется немного нелогичным и не дает хорошего результата.

Так как же поместить изображение в его исходном размере в PdfPCell таблицы без необходимости масштабировать его?

Вот мой код:

private PdfPTable CreateTestPDF()
{
    PdfPTable table = new PdfPTable(1);
    table.WidthPercentage = 100;

    Phrase phrase = new Phrase("MY TITLE", _font24Bold);
    table.AddCell(phrase);

    PdfPTable nestedTable = new PdfPTable(5);
    table.WidthPercentage = 100;

    Phrase cellText = new Phrase("cell 1", _font9BoldBlack);
    nestedTable.AddCell(cellText);

    cellText = new Phrase("cell 2", _font9BoldBlack);
    nestedTable.AddCell(cellText);

    cellText = new Phrase("cell 3", _font9BoldBlack);
    nestedTable.AddCell(cellText);

    iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(@"d:\MyPic.jpg");
    image.Alignment = iTextSharp.text.Image.ALIGN_CENTER;
    PdfPCell cell = new PdfPCell(image);
    cell.HorizontalAlignment = PdfPCell.ALIGN_MIDDLE;
    nestedTable.AddCell(cell);

    cellText = new Phrase("cell 5", _font9BoldBlack);
    nestedTable.AddCell(cellText);

    nestedTable.AddCell("");

    string articleInfo = "Test Text";
    cellText = new Phrase(articleInfo, _font8Black);
    nestedTable.AddCell(cellText);

    nestedTable.AddCell("");
    nestedTable.AddCell("");
    nestedTable.AddCell("");

    table.AddCell(nestedTable);
    SetBorderSizeForAllCells(table, iTextSharp.text.Rectangle.NO_BORDER);
    return table;
}

static BaseColor _textColor = new BaseColor(154, 154, 154);
iTextSharp.text.Font _font8 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 8, iTextSharp.text.Font.NORMAL, _textColor);
iTextSharp.text.Font _font8Black = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 8, iTextSharp.text.Font.NORMAL, BaseColor.BLACK);
iTextSharp.text.Font _font9 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 9, iTextSharp.text.Font.NORMAL, _textColor);
iTextSharp.text.Font _font9BoldBlack = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 9, iTextSharp.text.Font.BOLD, BaseColor.BLACK);
iTextSharp.text.Font _font10 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.NORMAL, _textColor);
iTextSharp.text.Font _font10Black = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.NORMAL, BaseColor.BLACK);
iTextSharp.text.Font _font10BoldBlack = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.BOLD, BaseColor.BLACK);
iTextSharp.text.Font _font24Bold = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 24, iTextSharp.text.Font.BOLD, _textColor);

Ответы [ 5 ]

14 голосов
/ 12 июня 2010

Я использую iTextSharp v4.1.2 и получаю следующее поведение:

Используя этот код, добавляя изображение непосредственно в таблицу с помощью метода AddCell, изображение масштабируется до ячейки:

nestedTable.AddCell(image);

Используя этот код, добавляя изображение в ячейку, затем добавляя ячейку в таблицу, изображение отображается в исходном размере:

PdfPCell cell = new PdfPCell(image);
cell.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
nestedTable.AddCell(cell);



Вы добавили изображение непосредственно в документ PDF (вне таблицы), чтобы сравнить / перепроверить размеры изображения?

document.add(image);



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

РЕДАКТИРОВАТЬ

Я простоскачал v5.0.2 и я получил те же результаты, что и упомянутые выше.Я пробовал это с изображениями, которые меньше и больше, чем размер ячейки, и поведение такое же;первый метод масштабирует изображение, второй - нет.

РЕДАКТИРОВАТЬ

Что ж, очевидно, я годами ошибался насчет всего DPI, когда дело доходит доизображений.Кажется, я не вижу, что вообще имеет значение, каково разрешение изображения.
Я создал изображение 600x400 пикселей с тремя различными разрешениями: 72 точек на дюйм, 96 точек на дюйм и 110 точек на дюйм.Затем я добавил каждое из этих изображений в новый документ размером 600x400.

Dim pSize As Rectangle = New Rectangle(600, 1000)
Dim document As Document = New Document(pSize, 0, 0, 0, 0)

Для каждого из трех файлов изображений при добавлении в документ с помощью

document.add(image)

они соответствуютдокумент идеально, без различий для различных настроек DPI.

9 голосов
/ 23 июня 2011

@ Ответ Stewbob работает, но он только случайно связан с методами таблицы.

С iTextSharp дело в том, что он будет вести себя по-разному в зависимости от того, какой конструктор вы используете.Это (досадно) увеличит изображение, чтобы заполнить ячейку:

PdfPCell c = new PdfPCell();
c.Add(image);
c.setHorizontalAlignment(Element.ALIGN_CENTER); // this will be ignored

Но это оставит изображение в размере, который вы установили (и разрешите выравнивание):

PdfPCell c = new PdfPCell(image);  
c.setHorizontalAlignment(Element.ALIGN_CENTER);

Я не знаю точно, почему это так, это связано с тем, что ячейка находится в «текстовом режиме», если вы добавляете изображение в конструкторе, а не в «комбинированном режиме», если добавляете его позже (в этом случае каждый объектдолжен заботиться о своем выравнивании).

Еще немного информации (на Java, но все еще применимо) http://tutorials.jenkov.com/java-itext/table.html#cell-modes

3 голосов
/ 18 марта 2011

Так что, если вам нужно сохранить размер изображения в PdfPCell, вы можете использовать этот код:

                iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageFilePath);

                 // Save the image width
                float width = image.Width;
                PdfPCell cell = new PdfPCell();
                cell.AddElement(image);


                // Now find the Image element in the cell and resize it
                foreach (IElement element in cell.CompositeElements)
                {
                    // The inserted image is stored in a PdfPTable, so when you find 
                    // the table element just set the table width with the image width, and lock it.
                    PdfPTable tblImg = element as PdfPTable;
                    if (tblImg != null)
                    {
                        tblImg.TotalWidth = width;
                        tblImg.LockedWidth = true;
                    }
                }
1 голос
/ 27 сентября 2012

Функция имеет свойство соответствовать изображению.Только добавьте true

cell.AddElement(image,true);
0 голосов
/ 28 марта 2018

Для тех, кто просит перегрузки, используйте это:

var imageCell = new PdfPCell(image, true);

вместо:

cell.AddElement(image,true);
...