2016-01-13 54 views
1

我有一个函数来中继在PDF领域的顶部邮票作为填充richtext字段。PDF columtext缩小到适合使用iText或iTextSharp

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字段的方法,以便所有文本符合维护的样式,请让我知道。

+0

你说你*填充richtext字段*。对我来说,它看起来更像是将文字印到常规页面内容的位置上。填充字段通常涉及将内容添加到字段本身及其小部件注释中... – mkl

+0

我更改了语言,您是正确的。我将文本加盖到richtext字段上,因为我认为填充richtext字段没有更好的方法。让我知道如果我错了。谢谢你指出。 – user1541389

+0

*我认为填充richtext字段没有更好的方法。 - 理论上应该有,但我还没有认真对待这个任务。这就是说,如果*填充*的方式对你来说可以,那么可以调整坐标系来使事情合适。从本质上讲,您已经预留了一个带有丰富文本字段的区域,并且希望在那里制作一些丰富的文本内容,对吗? – mkl

回答

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循环)应该是正确的。