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

Jul*_*iën 2 c# pdf-generation itext

我正在尝试使用 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);
    }
Run Code Online (Sandbox Code Playgroud)

现在这似乎微不足道。可能是这样,但我尝试了几种选择,但都无法正常工作(或根本无法正常工作):

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

我的预感是这IPdfPCellEvent似乎是正确的方法。但所有 iText 选项和变体都令人难以抗拒。

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

Sam*_*eck 5

我假设您想在此图像中使用第二个表: 网格表

在 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);
            }
Run Code Online (Sandbox Code Playgroud)

至于为什么向 PdfPCell 添加填充似乎不起作用:

尽管在您的示例中仍然绘制边界的原因

table.DefaultCell.Border = Rectangle.NO_BORDER;
Run Code Online (Sandbox Code Playgroud)

是因为您从不使用默认单元格,因为您创建了一个自定义单元格var cell = new PdfPCell();并将自定义单元格传递给table.AddCell(cell);. 如果您使用了table.addCell(img),则边框将不存在(尽管您的填充仍然不是您想要的间距,因为它没有在默认单元格上设置)。