iTextSharp:如何在 1 行中添加 2 个句子并从 datagridview 调整单元格的宽度?

iTextSharp : How to add 2 sentence in 1 line and adjust width of cells from datagridview?

我有一个 winform,允许用户通过 DataGridView 键入,然后将数据转换为 PDF 文档。

但是我在 Table 的格式方面遇到了问题,其中单元格的格式根据宽度大小不正确。

我已经尝试将我的 DataGridView 单元格宽度设置为 "Fill" 类型,但在转换为 PDF 时它不会改变结果。

除此之外,我们真的可以使用 iTextSharp 在 1 行中插入 2 个不同的句子吗?

Paragraph b1 = new Paragraph("OWNER NAME: " + "                                      " + "Property Name: ");

Paragraph b2 = new Paragraph("Property Name: " + "\n");

有没有办法合并 b1 和 b2?

结果应该如图所示。

属性 名称应该在与 "Owner Name" 同一行的最右侧。 单元格宽度应基于 DataGridView

中配置的列大小

编辑 1:

在下面的 PDF 代码中添加我的 DataGridView 转换 -

private void Button1_Click(object sender, EventArgs e)
{
        PdfPTable pdfTable = new PdfPTable(dataGridView1.ColumnCount);
        //pdfTable.DefaultCell.Padding = 10;
        pdfTable.WidthPercentage = 100;
        pdfTable.HorizontalAlignment = Element.ALIGN_LEFT;
        pdfTable.DefaultCell.BorderWidth = 1;

        //Adding Header row from DGV to PDFTable
        foreach (DataGridViewColumn column in dataGridView1.Columns)
        {
            PdfPCell cell = new PdfPCell(new Phrase(column.HeaderText));
            //cell.BackgroundColor = new iTextSharp.text.Color(240, 240, 240);
            pdfTable.AddCell(cell);
        }

        //Adding DataRow from DGV to PDFTable
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            foreach (DataGridViewCell cell in row.Cells)
            {
                try
                {
                    pdfTable.AddCell(cell.Value.ToString());
                }
                catch { }
            }
        }

        //PDFVariablesForPathAndNaming
        int filecount = 0;
        int i;
        string path = pathtofile1;

        for (i = 0; File.Exists(path + @"YTLHPITARF_" + i + DateTime.Now.ToString("yyyyMMdd") + ".pdf"); i++)
        {
            filecount = i + 1;
        }

        string fileLoc = path + @"YTLHPITARF_" + filecount + DateTime.Now.ToString("yyyyMMdd") + ".pdf";
        var filename = Path.GetFileName(fileLoc);
        string pathtofile2 = pathtofile1 + filename;

        //ToBeUsedInDataBase
        dName = filename;

        //Start of PDF Creation
        Document document = new Document(iTextSharp.text.PageSize.A4.Rotate());
        PdfWriter.GetInstance(document, new FileStream(fileLoc, FileMode.Create));
        document.Open();

        //FontSizeAndFormat
        iTextSharp.text.Font head1 = FontFactory.GetFont("Arial", 14, iTextSharp.text.Font.BOLD);
        iTextSharp.text.Font head2 = FontFactory.GetFont("Arial", 8, iTextSharp.text.Font.NORMAL);
        iTextSharp.text.Font head3 = FontFactory.GetFont("Arial", 10, iTextSharp.text.Font.NORMAL);
        iTextSharp.text.Font bold1 = FontFactory.GetFont("Arial", 12, iTextSharp.text.Font.BOLD);

        Paragraph a1 = new Paragraph("ASSET RETURN FORM", head1);
        Paragraph a2 = new Paragraph("(due to Staff resign / Outlet close / Repair)" + "\n\n", head2);

        Paragraph b1 = new Paragraph("OWNER NAME: ", head3);
        b1 = new Paragraph();
        b1.Add(new Chunk("OWNER NAME: ", head3));
        iTextSharp.text.TabSettings tab = new TabSettings();
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(Chunk.TABBING);
        b1.Add(new Chunk("Property Name: ", head3));

        Paragraph c1 = new Paragraph("SUBMITTED BY: "+ "\n\n" + "\n", head3);
        Paragraph d1 = new Paragraph("NAME: ", head3);
        Paragraph e1 = new Paragraph("DATE: " + DateTime.Today.ToString("yyyyMMdd"), head3);

        //Paragraph Alignment
        a1.Alignment = Element.ALIGN_CENTER;
        a2.Alignment = Element.ALIGN_CENTER;

        //Paragraph Insertion
        document.Add(a1);
        document.Add(a2);
        document.Add(b1);
        pdfTable.SpacingBefore = 3f;
        document.Add(pdfTable);
        document.Add(c1);
        document.Add(d1);
        document.Add(e1);
        //document.Add(f1);
        //document.Add(g1);

        //CloseCreationOfPDF
        document.Close();

        //OpenCreatedPDF
        System.Diagnostics.Process.Start(pathtofile2);
}

[解决方案]

在 C# 中,创建带制表符的内联文本按以下方式完成:

Paragraph c1 = new Paragraph("SUBMITTED BY: "+ "\n\n" + "\n", head3);
            c1 = new Paragraph();
            c1.Add(new Chunk("SUBMITTED BY : ", head3));
            c1.Add(Chunk.TABBING);
            c1.Add(Chunk.TABBING);
            c1.Add(Chunk.TABBING);
            c1.Add(Chunk.TABBING);
            c1.Add(new Chunk("ACKNOWLEDGED/TAKEN BY : ", head3));

Chunk.TABBING 将在文本之间创建一个 space。如下图所示:

根据您将 DataGridView 转换为 PDF 等文件的方式调整单元格宽度大小,代码如下:

PdfPTable pdfTable = new PdfPTable(dataGridView1.ColumnCount);
float[] widths1 = new float[] { 5f, 30f, 30f, 5f, 15f, 30f, 30f };
pdfTable.SetWidths(widths1);

foreach (DataGridViewColumn column in dataGridView1.Columns)
            {
                iTextSharp.text.Font header1 = FontFactory.GetFont("Arial", 10, iTextSharp.text.Font.NORMAL);
                PdfPCell cell = new PdfPCell(new Phrase(column.HeaderText, header1)) { BorderWidth = 1, VerticalAlignment = Element.ALIGN_MIDDLE, HorizontalAlignment = Element.ALIGN_CENTER };
                //cell.BackgroundColor = new iTextSharp.text.Color(240, 240, 240);
                pdfTable.AddCell(cell);
            }

我使用 DataGridView 中的列数创建了我的 pdftable。 有了这个,我使用浮点数组手动调整每列宽度的大小。上图已经在用这个方法了