我想在提供的X,Y位置将现有pdf插入给定文本。
我正在使用iTextSharp(4.1.6.0)
我接受位置(插入文本)和要插入的值,在 datagridview 控件中,仅当指定的位置具有插入时,文本才会插入到指定的位置没有图像。
内容未插入输入pdf中包含图像的位置。
是否有任何不同的方法可以将文本添加到现有的pdf中,以便在指定的位置插入文本,而不管图像是否存在。
请在下面找到我的代码:
for (int i = 0; i < reader.NumberOfPages; i++)
{
document.NewPage();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
gridColumn = Convert.ToInt32(row.Cells[2].Value);
if (gridColumn == i + 1)
{
//document.NewPage();
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.SetColorFill(iTextSharp.text.Color.BLACK);
cb.SetFontAndSize(bf, 8);
text = "" + row.Cells[3].Value;
cb.BeginText();
cb.ShowTextAligned(2, text, Convert.ToSingle(row.Cells[0].Value), Convert.ToSingle(row.Cells[1].Value), 0);
cb.EndText();
page = writer.GetImportedPage(reader, Convert.ToInt32(row.Cells[2].Value));
cb.AddTemplate(page, 0, 0);
}
else
{
page = writer.GetImportedPage(reader, i + 1);
cb.AddTemplate(page, 0, 0);
}
}//end foreach
}//end for i
答案 0 :(得分:1)
我通过使用PdfContentByte的SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL)解决了这个问题。
我在PDF上插入自己的文本时使用了writer.DirectContent,否则我使用了writer.DirectContentUnder
在下面找到我修改过的代码:
for (int i = 0; i < reader.NumberOfPages; i++)
{
document.NewPage();
log.Debug("Creating new page in the document..");
bool wasPageImported = false;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
gridColumn = Convert.ToInt32(row.Cells[2].Value);
if (gridColumn == i + 1)
{
//DirectContent for writing text to PDF
PdfContentByte cb = writer.DirectContent;
if (!wasPageImported)
{
page = writer.GetImportedPage(reader, Convert.ToInt32(row.Cells[2].Value));
cb.AddTemplate(page, 0, 0);
wasPageImported = true;
}
BaseFont bf = BaseFont.CreateFont(BaseFont.COURIER, BaseFont.CP1250, BaseFont.NOT_EMBEDDED);
//The text rendering mode causes entered text to appear above backround
cb.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL);
cb.SetColorFill(iTextSharp.text.Color.BLACK);
int fontSize = -1;
if (row.Cells[4].Value.ToString() == "" || row.Cells[4].Value == null)
{
fontSize = 12;
}
else
{
fontSize = Convert.ToInt32(row.Cells[4].Value);
}
cb.SetFontAndSize(bf, fontSize);
text = "" + row.Cells[3].Value;
cb.BeginText();
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, Convert.ToSingle(row.Cells[0].Value), Convert.ToSingle(row.Cells[1].Value), 0);
cb.EndText();
}
else
{
//DirectContentUnder if not writing any text to PDF
PdfContentByte cb = writer.DirectContentUnder;
page = writer.GetImportedPage(reader, i + 1);
cb.AddTemplate(page, 0, 0);
}
}//end foreach
}//end for int i