c# - 使用 iTextSharp 和 C# 自动调整表格列宽

标签 c# .net pdf datagridview itext

我已使用 iTextSharp 将 DataGridView 数据导出为 PDF。列宽完全相同,并且某些标题列字被错误地分解。我想做的是自动调整标题列宽度以适应每个标题文本长度。

这是我的代码:

 PdfPTable table = new PdfPTable(dgv.Columns.Count);
        for (int j = 0; j < dgv.Columns.Count; j++)
        {
            Font font = new Font(Font.FontFamily.COURIER, 14, Font.ITALIC);
            font.Color = BaseColor.BLUE;

            if (j == 0)
            {
                Phrase p1 = new Phrase(dgv.Columns[j].HeaderText, font);
                table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
                table.WidthPercentage = 100;
                table.AddCell(p1);
            }

            else
            {
                string header = dgv.Columns[j].HeaderText;
                header = Regex.Replace(dgv.Columns[j].HeaderText, "[A-Z]", " $0").Trim();
                Phrase p = new Phrase(header, font);
                table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
                table.WidthPercentage = 100;
                table.AddCell(p);
            }
        }
        table.HeaderRows = 1;

        for (int i = 0; i < dgv.Rows.Count; i++)
            for (int k = 0; k < dgv.Columns.Count; k++)
                if (dgv[k, i].Value != null)
                {
                    Phrase p = new Phrase(dgv[k, i].Value.ToString());
                    table.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
                    table.AddCell(p);
                }


        doc.Add(table);

这是 PDF 输出:

enter image description here

最佳答案

要自动调整列大小,您需要自己计算标题字符串的宽度,然后设置表格列宽度。

首先是一个简单的辅助方法,用于从任意字符串集合中获取列宽:

public float[] GetHeaderWidths(Font font, params string[] headers)
{ 
    var total = 0;
    var columns = headers.Length;
    var widths = new int[columns];
    for (var i = 0; i < columns; ++i)
    {
        var w = font.GetCalculatedBaseFont(true).GetWidth(headers[i]);
        total += w;
        widths[i] = w;
    }
    var result = new float[columns];
    for (var i = 0; i < columns; ++i) 
    {
        result[i] = (float)widths[i] / total * 100;
    }
    return result;
}

然后设置表格列宽:

string[] headers = new string[]
{ 
    "Order Id", "Customer Id", "Customer Name", "Product Id",
    "Product Description", "Quantity", "Product Received"
};
Font font = new Font(Font.FontFamily.COURIER, 14, Font.ITALIC);
font.Color = BaseColor.BLUE;
var table = new PdfPTable(headers.Length) { WidthPercentage = 100 };
table.SetWidths(GetHeaderWidths(font, headers));

using (var stream = new MemoryStream())
{
    using (var document = new Document(PageSize.A4.Rotate()))
    {
        PdfWriter.GetInstance(document, stream);
        document.Open();
        for (int i = 0; i < headers.Length; ++i)
        {
            table.AddCell(new PdfPCell(new Phrase(headers[i], font)));
        }
        document.Add(table);
    }
    File.WriteAllBytes(OUT_FILE, stream.ToArray());
}

输出:

enter image description here

关于c# - 使用 iTextSharp 和 C# 自动调整表格列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788260/

相关文章:

c# - "Universal"控制(大致)任何类型的属性?

ruby - 无法通过 gsub 和 ||= ruby​​ 方法解析多个电话号码

ios - 如何在 iOS 应用程序中编辑 PDF 表单?

php - 使用 dompdf 将页面转换为 PDF

c# - 无法将 Entity Framework 与 MySQL 一起使用

c# - 将列表转换为数据表

c# - 初始化线程时出错(关闭?)

c# - 如何将小工具集成到我的 .NET 应用程序中

c# - 您如何知道何时通过 XML 序列化加载?

java - 上传到服务器时从APK获取信息