我正在尝试使用iTextSharp(v5.5.10)渲染带有图像网格的PDF。图像都具有相同的尺寸,应均匀分布在一个页面上。
但是,使用下面提到的代码,我很难设置适当的边距或单元格之间的间距。
视觉上这意味着预期的结果是:
黄色突出显示的行是我得到以下结果的问题:
注意图像之间没有空格?这基于我的以下代码:
public void CreateGridOfImages(string outputFilePath)
{
// note: these constants are in millimeters (mm),
// which are converted using the ToPoints() helper later on
const float spacingBetweenCells = 7;
const float imageWidth = 80;
const float imageHeight = 80;
const string[] images = new [] { "a.jpg", "b.jpg", "c.jpg" };
using (var stream = new FileStream(outputFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.None))
{
var document = new iTextSharp.text.Document(PageSize.B2, 0f, 0f, 0f, 0f);
var writer = PdfWriter.GetInstance(document, stream);
try
{
document.Open();
var table = new PdfPTable(5);
table.DefaultCell.Border = Rectangle.NO_BORDER;
foreach (var imagePath in images)
{
var img = iTextSharp.text.Image.GetInstance(imagePath);
img.ScaleToFit(ToPoints(imageWidth), ToPoints(imageHeight));
var cell = new PdfPCell();
// THIS IS THE PROBLEM... HOW TO SET IMAGE SPACING?
var cellMargin = ToPoints(spacingBetweenCells);
cell.AddElement(img);
table.AddCell(cell);
}
document.Add(table);
}
catch (Exception ex)
{
throw ex;
}
finally
{
document.Close();
}
}
}
private float ToPoints(float millimeters)
{
// converts millimeters to points
return iTextSharp.text.Utilities.MillimetersToPoints(millimeters);
}
现在这似乎是微不足道的。它可能是,但我已经尝试了几个选项,并且没有一个可以正常工作(或根本没有):
我的预感是IPdfPCellEvent
似乎是正确的做法。但是所有的iText选项和变体都是压倒性的。
总结一下,有谁知道如何正确设置单元格之间的边距/间距?
答案 0 :(得分:4)
在iText表格中创建单元格之间的白色间距的唯一方法是将相关边框设置为背景颜色并使用单元格的填充进行播放。我创建单元格的关键代码是:
for(int i = 0; i < nrCols* nrRows;i++) {
var img = Image.GetInstance(imagePath);
img.ScaleToFit(ToPoints(imageWidth), ToPoints(imageHeight));
//Create cell
var imageCell = new PdfPCell();
imageCell.Image = img;
imageCell.Border = Rectangle.BOX;
imageCell.BorderColor = useColor? BaseColor.YELLOW : BaseColor.WHITE;
//Play with this value to change the spacing
imageCell.Padding = ToPoints(spacingBetweenCells/2);
imageCell.HorizontalAlignment = Element.ALIGN_CENTER;
grid.AddCell(imageCell);
}
至于为什么在PdfPCell中添加填充似乎并不可行:
尽管
,仍然在您的示例中绘制边框的原因table.DefaultCell.Border = Rectangle.NO_BORDER;
是因为您从不使用默认单元格,因为您使用var cell = new PdfPCell();
创建了自定义单元格,并将自定义单元格传递给table.AddCell(cell);
。如果您使用过table.addCell(img)
,则边框不会出现(虽然您的填充仍然不是您想要的间距,因为它没有在默认单元格上设置)。