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

时间:2017-02-02 14:00:05

标签: 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并创建一个表)。但我无法有效地合并它们。我试过做一个doc.add(table),这会导致表格在pdf的下一页上,这是我不想要的。

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

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

有什么建议吗?

编辑:

我是itext的新手,之前没有使用过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();

2 个答案:

答案 0 :(得分:1)

您的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();

答案 1 :(得分:0)

你直接将Cell添加到表中,而不是你可以设置适当的单元格宽度然后使用你的数据创建单元格,然后使用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);