在iTextSharp PdfPTable中的图像网格之间设置边距或单元格间距

时间:2016-11-26 10:46:00

标签: c# pdf-generation itext

我正在尝试使用iTextSharp(v5.5.10)渲染带有图像网格的PDF。图像都具有相同的尺寸,应均匀分布在一个页面上。

但是,使用下面提到的代码,我很难设置适当的边距或单元格之间的间距。

视觉上这意味着预期的结果是:

expected

黄色突出显示的行是我得到以下结果的问题:

actual

注意图像之间没有空格?这基于我的以下代码:

   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);
    }

现在这似乎是微不足道的。它可能是,但我已经尝试了几个选项,并且没有一个可以正常工作(或根本没有):

  • 在每个
  • 之间添加带有填充的Paragraph()对象
  • 向PdfPCell添加填充似乎对我不起作用
  • 查看自定义IPdfPCellEvent示例
  • 完全定位图像(忘记PdfPTable)

我的预感是IPdfPCellEvent似乎是正确的做法。但是所有的iText选项和变体都是压倒性的。

总结一下,有谁知道如何正确设置单元格之间的边距/间距

1 个答案:

答案 0 :(得分:4)

我假设您要在此图片中添加第二个表:grid tables

在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),则边框不会出现(虽然您的填充仍然不是您想要的间距,因为它没有在默认单元格上设置)。