pdfstamper HTMLWorker itextSharp

时间:2014-06-11 06:18:24

标签: c# itextsharp

我的应用程序是MVC c#,我使用itextSharp 5.3.4使用现有模板生成PDF。我使用:

将文本添加到表单字段(来自sql数据库)
 pdfFormFields.SetField("Notes", cth.Notes.ToString());

我遇到的挑战是添加html内容,例如:

text text <img alt="" height="133" src="/Content/UserFiles/635380078478327671/Images/test.png" width="179" /> 

我在HTMLWorker之前用过:

生成段落
public Paragraph CreateSimpleHtmlParagraph (String text)
    {

    string fontpath = System.Web.HttpContext.Current.Server.MapPath("~/Content/");
    BaseFont bf = BaseFont.CreateFont(fontpath + "ARIALUNI.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    var f = new Font(bf, 10, Font.NORMAL);
    var p = new Paragraph { Alignment = Element.ALIGN_LEFT, Font = f };
    var styles = new StyleSheet();
    styles.LoadTagStyle(HtmlTags.SPAN, HtmlTags.FONTSIZE, "10");
    styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, BaseFont.IDENTITY_H);
    using (var sr = new StringReader(text))
        {
        var elements = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, styles);
        foreach (var e in elements)
            {
            p.Add(e);
            }
        }
    return p;
    }

无法弄清楚如何将段落添加到表单字段,甚至可以将新页面添加到现有表单或生成新文档并合并表单和新文档。非常感谢您的建议。

1 个答案:

答案 0 :(得分:1)

假设您要展平表单(如果这不是您的意图,我将删除此答案),我想推荐您参考此示例:MovieAds(请参阅{{3对于相应的C#示例)。

您有从HTMLWorker获得的iText元素列表。您正在将它们添加到Paragraph对象。这是错的。您应该将它们添加到ColumnText对象:

ColumnText ct = new ColumnText(canvas);
var elements = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, styles);
foreach (var e in elements) {
    ct.AddElement(e);
}

现在您需要该字段的位置:

AcroFields.FieldPosition f = form.GetFieldPositions("Notes")[0];

您现在可以使用此FieldPosition对象来定义ColumnText对象的矩形:

ct.SetSimpleColumn(
    f.position.Left, f.position.GetBottom(2),
    f.position.GetRight(2), f.position.Top
  );

要渲染您已添加到ct的元素,只需执行以下操作:

ct.Go();

请注意,将忽略不适合矩形的元素。这就是我引用的示例返回布尔值的原因:

return ColumnText.HasMoreText(ct.Go(simulate));

如果HasMoreText()方法返回true,我会尝试重新添加相同的元素,但使用较小的字体。