我正在搜索有关ItextSharp的已知问题和答案,并使用此库将表格添加到PDF,但没有人有类似的问题。
这是我的代码:
foreach (System.Collections.DictionaryEntry item in fields.Fields)
{
AcroFields.Item acroFieldItem = fields.GetFieldItem(FieldName);
PdfDictionary formFieldsValues = (PdfDictionary)acroFieldItem.values[0];
string defaultFieldValue = "";
if (formFieldsValues.Contains(PdfName.DV))
{
defaultFieldValue = formFieldsValues.Get(PdfName.DV).ToString();
}
int startIndex = defaultFieldValue.IndexOf("<%", 0);
if (startIndex != -1)
{
string FieldNameValue = TemplatesParser.Parse(defaultFieldValue, fieldDataSet);
string tableName = TemplatesParser.GetElementName(defaultFieldValue).Replace(":::", "");
if (tableNames.Contains(tableName))
{
foreach (int i in tableIndexes)
{
//var dt = new DataTable();
var expression = "ShowInTable = '" + tableName +"'";
var rows = m_formFieldDataSet.Tables[i].Select(expression);
if (rows.Any())
{
var dt = rows.CopyToDataTable();
var firstParam = fields.GetFieldPositions(FieldName);
var a = (firstParam[3] - firstParam[1]);
Logger.Debug(string.Format("creating table with name {0}, width {1}", tableName, a.ToString("#,#####")));
var table = CreateTable(tableName, dt,(firstParam[3]-firstParam[1]));
Logger.Debug(string.Format("created table with width {0}", table.TotalWidth.ToString("#,#####")));
var canvase = stamper.GetOverContent(Convert.ToInt32(firstParam[0]));
table.WriteSelectedRows(0, -1, firstParam[1], firstParam[4], canvase);
fields.SetField(FieldName, canvase.ToString());
}
}
}
else
{
fields.SetField(FieldName, FieldNameValue);
}
}
}
这是填补表格的方法:
private PdfPTable CreateTable( string tableName, DataTable dataTable, float elementWidth)
{
int colno = dataTable.Columns.Count - 1;
int colNameIndex = dataTable.Columns.IndexOf("ShowInTable");
int rowNo = dataTable.Rows.Count;
float singleElementWidth = elementWidth / colno;
float[] elementsWidths = new float[colno];
for (var c = 0; c < colno; c++)
{
elementsWidths[c] = singleElementWidth;
}
PdfPTable table = new PdfPTable(colno);
table.SetTotalWidth(elementsWidths);
PdfPCell cell = new PdfPCell(new Phrase(tableName));
cell.Colspan = colno;
table.AddCell(cell);
for (var col = 0; col <= colno; col++)
{
if (col != colNameIndex)
{
table.AddCell(dataTable.Columns[col].ColumnName);
}
}
for (var r = 0; r <= rowNo -1; r++)
{
for (var c =0; c <= colno; c++)
{
if (c != colNameIndex)
{
table.AddCell(dataTable.Rows[r].ItemArray[c].ToString());
}
}
}
return table;
}
使用此代码进行单元测试时,一切都按预期工作,生成表格并以PDF格式显示。将其用作应用程序的一部分时,表格不可见。
注意,只有一次我设法在应用程序中生成的PDF中创建可见表,但它使用不同的PDF模板和不同的数据源。
我已经尝试过检查那些问题/答案
WriteSelectedRows doesnt show a table on PDF
How do I add table to existing pdf using iTextSharp
和width确实不同于0,并且GetOverContent参数设置为正确的页面。
是否有一些特定的PDF模板设置我需要应用才能正确生成表格?
提前致谢。