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