PDF columtext缩小以适合使用iText或iTextSharp

时间:2016-01-13 19:52:56

标签: java c# pdf itextsharp itext

我有一个功能,可以在PDF中的字段顶部中继图章,作为填充richtext字段。

    public void FillRichTextField(AcroFields pdfForm, PdfStamper pdfStamper, string fieldName, string value)
{
    System.Collections.Generic.IList<AcroFields.FieldPosition> pos = pdfForm.GetFieldPositions(fieldName);
    //tell itextSharp to overlay this content 
    PdfContentByte contentByte = pdfStamper.GetOverContent(pos[0].page);
    //create a new paragraph
    Paragraph par = new Paragraph();
    //parse html
    var mh = new SampleHandler();
    //Bind a reader to our text
    using (TextReader sr = new StringReader(value))
    {
        //Parse
        XMLWorkerHelper.GetInstance().ParseXHtml(mh, sr);
    }
    for (int k = 0; k < mh.elements.Count; k++)
    {
        par.Add((IElement)mh.elements[k]);
    }

    //create a ColumnText to hold the paragraph and set position to the position of                   the field
    ColumnText ct = new ColumnText(contentByte);

    ct.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top);
    ct.AddElement(par);
    int status = ct.Go();
    bool fits = !ColumnText.HasMoreText(status);

}

段落被截断,所以我想调整段落的大小/重新缩放以适应ColumnText,似乎没有办法做到这一点。由于段落包含具有自己字体的richtext数据,因此我无法启动新字体。我想我最好的选择是将段落转换为可缩放的图像,然后调整大小以适应?

或者如果有更好的方法来填充richtext字段以便所有文本都符合维护的样式,请告诉我。

1 个答案:

答案 0 :(得分:1)

如果您更改方法FillRichTextField,则会缩小其绘制的内容以适合表单字段矩形。此外,它会删除表单字段,因为它会隐藏绘制的文本。

public void FillRichTextField(AcroFields pdfForm, PdfStamper pdfStamper, string fieldName, string value)
{
    System.Collections.Generic.IList<AcroFields.FieldPosition> pos = pdfForm.GetFieldPositions(fieldName);
    PdfContentByte contentByte = pdfStamper.GetOverContent(pos[0].page);
    Rectangle fieldRectangle = pos[0].position;

    PdfTemplate template = contentByte.CreateTemplate(fieldRectangle.Width, fieldRectangle.Height);

    ColumnText ct = new ColumnText(template);
    XMLWorkerHelper.GetInstance().ParseXHtml(new ColumnTextElementHandler(ct), new StringReader(value));

    for (float factor = 1; ; factor *= 1.5f)
    {
        ct.SetSimpleColumn(0, 0, factor * fieldRectangle.Width, factor * fieldRectangle.Height);

        if (!ColumnText.HasMoreText(ct.Go(false)))
        {
            ct.Go();
            template.Width = factor * fieldRectangle.Width;
            template.Height = factor * fieldRectangle.Height;
            contentByte.AddTemplate(template, 1 / factor, 0, 0, 1 / factor, fieldRectangle.Left, fieldRectangle.Bottom);

            pdfForm.RemoveField(fieldName);

            contentByte.Rectangle(fieldRectangle.Left, fieldRectangle.Bottom, fieldRectangle.Width, fieldRectangle.Height);
            contentByte.Stroke();

            return;
        }
    }
}

与此处理程序类组合

public class ColumnTextElementHandler : IElementHandler
{
    public ColumnTextElementHandler(ColumnText ct)
    {
        this.ct = ct;
    }

    ColumnText ct = null;

    public void Add(IWritable w)
    {
        if (w is WritableElement)
        {
            foreach (IElement e in ((WritableElement)w).Elements())
            {
                ct.AddElement(e);
            }
        }
    }
}

但结果还不令人满意:

Screenshot

如您所见,有一些重叠的文字。

上面的代码呈现了它从XMLWorker接收的内容。因此,我的XMLWorker使用不正确或输入不好。这样的缩放代码(即for循环)应该是正确的。