Автоматическое изменение размера изображения в PdfPCell с помощью iTextSharp

У меня странная проблема с изображениями в библиотеке 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);

Ответ 1

Я использую 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, когда дело касается изображений. Кажется, я не вижу, что вообще имеет значение, что такое DPI изображения.
Я создал изображение 600x400 пикселей с тремя различными разрешениями: 72 dpi, 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.

Ответ 2

Ответ на

@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

Итак, если вам нужно указать размер изображения в 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;
                    }
                }

Ответ 4

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

cell.AddElement(image,true);

Ответ 5

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

var imageCell = new PdfPCell(image, true);

вместо:

cell.AddElement(image,true);