我使用iTextSharp
填写一个PDF
模板。 我使用的数据被保存在数据库中,并HTML
格式。 我的问题是,当我加载AcroField
与这段文字,我得到它做的换行符,但是没有大胆的 ,也没有斜体 。 我已经尝试使用HtmlWorker
,但所有在线的例子显示它被用来转换HTML
到PDF
,但我想设置一个AcroField
在PDF模板。 任何帮助,将不胜感激。
Answer 1:
消磨时间翻翻论坛和iTextSharp的源代码后,我找到了解决办法。 与HTML格式的文本,而不是填补Acrofield,我用了一个ColumnText。 我解析HTML文本和IElements加载到一个段落。 然后添加段落到ColumnText。 然后,我在覆盖上ColumnText何处Acrofield应该是顶部,使用领域的坐标。
public void AddHTMLToContent(String htmlText,PdfContentByte contentBtye,IList<AcroFields.FieldPosition> pos)
{
Paragraph par = new Paragraph();
ColumnText c1 = new ColumnText(contentBtye);
try
{
List<IElement> elements = HTMLWorker.ParseToList(new StringReader(htmlText),null);
foreach (IElement element in elements)
{
par.Add(element);
}
c1.AddElement(par);
c1.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top);
c1.Go(); //very important!!!
}
catch (Exception ex)
{
throw;
}
}
下面是这个函数的调用的例子。
string htmlText ="<b>Hello</b><br /><i>World</i>";
IList<AcroFields.FieldPosition> pos = form.GetFieldPositions("Field1");
//Field1 is the name of the field in the PDF Template you are trying to fill/overlay
AddHTMLToContent(htmlText, stamp.GetOverContent(pos[0].page), pos);
//stamp is the PdfStamper in this example
有一件事我没碰上,而这样做,这是事实,我的Acrofield确实有一个预定义的字体大小。 由于这个功能设置ColumnText上的场顶部,任何字体的变化将在功能来完成。 这里是改变字体大小的一个示例:
public void AddHTMLToContent(String htmlText,PdfContentByte contentBtye,IList<AcroFields.FieldPosition> pos)
{
Paragraph par = new Paragraph();
ColumnText c1 = new ColumnText(contentBtye);
try
{
List<IElement> elements = HTMLWorker.ParseToList(new StringReader(htmlText),null);
foreach (IElement element in elements)
{
foreach (Chunk chunk in element.Chunks)
{
chunk.Font.Size = 14;
}
}
par.Add(elements[0]);
c1.AddElement(par);
c1.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top);
c1.Go();//very important!!!
}
catch (Exception ex)
{
throw;
}
}
我希望这样可以节省有人在未来的一段时间和精力。
Answer 2:
所以,我不得不调整了一下周围的代码在过去几个月里,我发现了大约办法做到这一点更好/更小一轮。
public void Final(string text,string fieldName,string filename)
{
iTextSharp.text.pdf.PdfReader reader = null;
iTextSharp.text.pdf.PdfStamper stamp = null;
reader = new PdfReader(file path to template);
stamp = new PdfStamper(reader, new FileStream(path to new file, FileMode.CreateNew));
AcroFields form = stamp.AcroFields;
//get the position of the field
IList<AcroFields.FieldPosition> pos = form.GetFieldPositions(fieldName);
//tell itextSharp to overlay this content
PdfContentByte contentBtye = stamp.GetOverContent(pos[0].page);
//create a new paragraph
Paragraph par = new Paragraph();
//parse html
List<IElement> elements = HTMLWorker.ParseToList(new StringReader(text), null);
for (int k = 0; k < elements.Count; k++)
{
par.Add((IElement)elements[k]);
}
//create a ColumnText to hold the paragraph and set position to the position of the field
ColumnText ct = new ColumnText(contentBtye);
ct.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top);
ct.AddElement(par);
ct.Go();
stamp.Close();
reader.Close();
}
文章来源: Fill PDF template acrofield with HTML formatted text using iTextSharp