这个问题,关于使用itextSharp创建pdf
我在该表的第一行中添加了表格,我已经手动添加了名称,ID等等,并且表格名称和来自数据库的ID现在我的问题是当页面结束时再次我要手动添加相同像Name,Id和数据一样的行将继续来自数据库所以我该怎么做?请帮助我摆脱这些问题..
答案 0 :(得分:1)
这一切都取决于您如何创建文档。您是附加到现有文档,还是从头开始生成新文档?无论哪种方式,您可能最终都会使用PageEvents
来完成此任务。当编写器到达新页面的开头时,您可以编写自定义OnPageEnd
事件来“重写”表头。如果你是从“从头开始”的角度来做这件事,它可能会变得棘手,但你应该还是没问题,只要你在期间>>你的表创建事件。如果要附加到现有文档,则创建包含表格的文件可能更符合您的利益,并在完成表格后将它们合并在一起。无论哪种方式,这都不是一个特别复杂的过程。如果要在for或while循环中创建表,例如:
for(int i = 0; a < 100; i++)
{
//OnPageEnd Event that adds the Table Header
table.addCell(cell)
}
这样,对于循环的每次迭代,它都会检查它是否必须写入新页面。如果没有,它将继续添加单元格。如果是,它将插入标题行,并继续循环。
应该很简单。我通常会创建一个包含我的页面事件的类文件,并在需要时调用它们。一旦你创建了类文件并创建了你的函数,它就像添加你用来编写当前事件的头文件一样简单。页面事件看起来比实际上更令人生畏,但是一旦你花一点时间阅读它们,你可以省去很多麻烦,你可以创建更多动态文档。
希望这能为你指明一个好方向,因为我自己在创建表格方面遇到了麻烦,并且干净地处理了分页符。
修改强>
我将向您展示一个我用于创建的简单方法,让我们说一个单元格表,以便轻松实现,但它可以扩展到您需要的数量。这假定您正在为表文件创建单独的文档,并在之后合并它们。这不是你问题的一部分,所以除非你要求进一步澄清如何解决这个问题,否则我会把它留下来。
private void appendTable(string inputFile, string outputFile, string id)
{
Document outputDoc = new Document(PageSize.LETTER, 15, 15, 35, 50);
PdfReader reader = new PdfReader(inputFile);
string sql = string.Format("SELECT * FROM table WHERE id='{0}'", id);
try
{
DataTable dt = db.GetDataTable(sql);
PdfPTable table = new PdfPTable(1);
iTextSharp.text.Font arial = FontFactory.GetFont("Arial", 8);
iTextSharp.text.Font arialheader = FontFactory.GetFont("Arial", 12);
table.WidthPercentage = 95;
PdfPCell headerCell = new PdfPCell(new Phrase("Cell Header", arialheader));
headerCell.HorizontalAlignment = 1;
table.AddCell(headerCell);
PdfWriter wr = PdfWriter.GetInstance(outputDoc, new FileStream(outputFile, FileMode.Create, FileAccess.ReadWrite));
foreach(DataRow row in dt.Rows)
{
PdfPCell cell = new PdfPCell(new Phrase("Cell Text", arial));
meterCell.HorizontalAlignment = 1; //Center Aligned
table.AddCell(meterCell);
}
outputDoc.Open();
wr.PageEvent = new PageEvents.Header();
wr.PageEvent = new PageEvents.Footer();
outputDoc.Add(table);
outputDoc.NewPage();
outputDoc.Close();
}
catch (PdfException ex)
{
MessageBox.Show(ex.Message.ToString() + " **** " + ex.StackTrace);
}
catch (NpgsqlException ex)
{
MessageBox.Show(ex.Message.ToString() + " **** " + ex.StackTrace);
}
}