使用 iText 或 iTextSharp 缩小 PDF columtext 以适应
PDF columtext shrink to fit using iText or iTextSharp
我有一个功能可以在 PDF 中的字段顶部中继图章以用作填充富文本字段。
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);
}
段落被截断,所以我想 resize/rescale 段落以适合 ColumnText,但似乎没有办法做到这一点。我无法启动新字体,因为该段落包含具有自己字体的富文本数据。我想我最好的选择是将段落转换为可缩放图像,然后调整大小以适合?
或者,如果有更好的方法来填充富文本字段,以便所有文本都符合所维护的样式,请告诉我。
如果您像这样更改方法 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;
}
}
}
结合此处理程序 class
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);
}
}
}
}
虽然结果还不令人满意:
如您所见,有一些重叠的文字。
上面的代码呈现它从 XMLWorker 接收到的内容。因此,要么我的 XMLWorker 用法不正确,要么输入错误。不过,缩放代码本身(即 for
循环)应该是正确的。
我有一个功能可以在 PDF 中的字段顶部中继图章以用作填充富文本字段。
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);
}
段落被截断,所以我想 resize/rescale 段落以适合 ColumnText,但似乎没有办法做到这一点。我无法启动新字体,因为该段落包含具有自己字体的富文本数据。我想我最好的选择是将段落转换为可缩放图像,然后调整大小以适合?
或者,如果有更好的方法来填充富文本字段,以便所有文本都符合所维护的样式,请告诉我。
如果您像这样更改方法 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;
}
}
}
结合此处理程序 class
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);
}
}
}
}
虽然结果还不令人满意:
如您所见,有一些重叠的文字。
上面的代码呈现它从 XMLWorker 接收到的内容。因此,要么我的 XMLWorker 用法不正确,要么输入错误。不过,缩放代码本身(即 for
循环)应该是正确的。