【问题标题】:Generate a table and append it to a pdf using c#?使用c#生成一个表并将其附加到pdf?
【发布时间】:2017-02-02 14:00:05
【问题描述】:

我的公司的 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,但我试图在下面的代码中对其进行测试,但表格没有显示。我查看了其他列文本示例,但没有看到将列文本添加回 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();

【问题讨论】:

    标签: c# csv pdf itext


    【解决方案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();
    

    【讨论】:

      【解决方案2】:

      您正在将 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多