C# 生成一个表并使用c将其附加到pdf?

C# 生成一个表并使用c将其附加到pdf?,c#,csv,pdf,itext,C#,Csv,Pdf,Itext,我公司的c项目有两个部分,我的公司希望我从csv生成一个pdf文件 I need to populate the fields of a pdf I need to add a table below the populated section on the blank area of the page (and this table needs to be able to rollover to the next page). 我可以单独完成这些工作,填充pdf并创建一个表。但我无法有效地合

我公司的c项目有两个部分,我的公司希望我从csv生成一个pdf文件

I need to populate the fields of a pdf
I need to add a table below the populated section on the blank area of the page (and this table needs to be able to rollover to the next page).
我可以单独完成这些工作,填充pdf并创建一个表。但我无法有效地合并它们。我尝试过做一个doc.addtable,这将导致该表出现在pdf的下一页,这是我不想要的

我基本上只需要能够指定表格在页面上的起始位置,这样它就不会与现有内容重叠,然后将表格标记到现有pdf上

如果这不起作用,我的另一个选择是尝试向原始pdf添加字段,这些字段将由表内容填充,因此它将改为基于字段的表

有什么建议吗

编辑:

我是itext新手,以前没有使用过columntext,但我正试图在下面的代码中测试它,但是没有显示该表。我查看了其他columntext示例,但没有看到columntext被添加回pdf的确切位置

    //CREATE FILLED FORM PDF
PdfReader reader = new PdfReader(sourcePath);       
PdfStamper pdfStamper = new PdfStamper(reader, new FileOutputStream(destPath));
pdfStamper.setFormFlattening(true);
AcroFields form = pdfStamper.getAcroFields();

form.setField("ID", "99999");
form.setField("ADDR1", "425 Test Street");
form.setField("ADDR2", "Test, WA 91334");
form.setField("PHNBR", "(999)999-9999");
form.setField("NAME", "John Smith");

//CREATE TABLE
PdfPTable table = new PdfPTable(3);
Font bfBold12 = new Font(FontFamily.HELVETICA, 12, Font.BOLD, new BaseColor(0, 0, 0)); 
insertCell(table, "Table", Element.ALIGN_CENTER, 1, bfBold12);
table.completeRow(); 

ColumnText column = new ColumnText(pdfStamper.getOverContent(1));
column.addElement(table);

pdfStamper.close();
reader.close();

您可以直接将单元格添加到表中,而不是设置适当的单元格宽度,然后使用数据创建单元格,然后使用WriteSelectedRows来更正行。下面的示例代码仅供参考

        var table = PdfWriter.CreateTable(9);
        table.SetWidths(new[] { 0.3f, 1.7f, 3f, 1f, 1f, 1f, 1f, 1f, 1f });

        var cells =
            from line in lines
            let values = new[]
            {
                new { Text = string.Empty, ColSpan = 1, Align = "<set value>" },
                new { Text = line.Description, ColSpan = 6, Align = "<set value>" },
                new { Text = string.Empty, ColSpan = 1, Align = "<set value>" },
                new { Text = FormatDecimal.Format(Math.Abs(line.Amount)), ColSpan = 1, Align = "<set value>"}
            }
            from value in values
            select new Cell
            {
                Grey = true,
                FontSize = "<set value>",
                HorizontalAlignment = value.Align,
                ColSpan = value.ColSpan,
                Text = value.Text
            };

        cells.ForEach(table.AddCell);

        var position = new Position(PdfWriter.DocLeft, PdfWriter.DocTop - 20 - 245);
        table.TotalWidth = PdfWriter.DocRight - PdfWriter.DocRightMargin;
        table.LockedWidth = "<set value>";
        table.WriteSelectedRows(0, -1, position.HorizontalPosition, position.VerticalPosition, Writer.DirectContent);

您的CSV数据无效或格式不正确,例如使用了额外的换行符或逗号,或者您的数据与此\n-1字符串生成混淆。每个数据集的控制台输出从8行到9行不等

要进行调试,请跳过构建此内容字符串,并将数据直接从CSV行写入PDF单元格,如:

Document doc = new Document();
PdfWriter.GetInstance(doc, new FileStream(Server.MapPath("file6.pdf"), FileMode.Create));
doc.Open();
PdfPTable table = new PdfPTable(7);

using (TextFieldParser parser = new TextFieldParser("t.csv"))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    while (!parser.EndOfData)
    {
        //Processing row
        string[] fields = parser.ReadFields();
        table.AddCell(new PdfPCell(new Paragraph(field[2]));
        table.AddCell(new PdfPCell(new Paragraph(field[3]));
        table.AddCell(new PdfPCell(new Paragraph(field[4]));
        //......
    }
}
doc.Add(table);
doc.Close();