【问题标题】:Setting margins, or cell spacing, between a grid of images in iTextSharp PdfPTable在 iTextSharp PdfPTable 中的图像网格之间设置边距或单元格间距
【发布时间】:2016-11-26 10:45:59
【问题描述】:

我正在尝试使用 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);
    }

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

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

我的直觉是IPdfPCellEvent 似乎是正确的方法。但是所有的 iText 选项和变体简直是压倒性的。

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

【问题讨论】:

    标签: c# pdf-generation itext


    【解决方案1】:

    我假设您想要这张图片中的第二张桌子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2017-01-20
      相关资源
      最近更新 更多