我的公司的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();
答案 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);