Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用iText或iTextSharp收缩PDF文本以适合_Java_C#_Pdf_Itextsharp_Itext - Fatal编程技术网

Java 使用iText或iTextSharp收缩PDF文本以适合

Java 使用iText或iTextSharp收缩PDF文本以适合,java,c#,pdf,itextsharp,itext,Java,C#,Pdf,Itextsharp,Itext,我有一个功能,在PDF中的字段顶部中继一个戳记,作为填充文本字段 public void FillRichTextField(AcroFields pdfForm, PdfStamper pdfStamper, string fieldName, string value) { System.Collections.Generic.IList<AcroFields.FieldPosition> pos = pdfForm.GetFieldPositions(field

我有一个功能,在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);

}
public void FillRichTextField(AcroFields pdfForm、PdfStamper、PdfStamper、string fieldName、string value)
{
System.Collections.Generic.IList pos=pdfForm.GetFieldPositions(字段名);
//告诉itextSharp覆盖此内容
PdfContentByte contentByte=pdfStamper.GetOverContent(位置[0]。第页);
//创建新段落
段落=新段落();
//解析html
var mh=新的SampleHandler();
//把读者和我们的文章联系起来
使用(TextReader sr=新的StringReader(值))
{
//解析
XMLWorkerHelper.GetInstance().ParseXHtml(mh,sr);
}
对于(int k=0;k
段落被截断了,所以我想调整段落大小/重新缩放段落以适应ColumnText,似乎没有办法做到这一点。我无法启动新字体,因为段落包含有自己字体的richtext数据。我想我最好的办法是将段落转换成可缩放的图像,然后调整大小以适应


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

如果您像这样更改方法
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;
        }
    }
}
尽管如此,结果仍不令人满意:

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


上面的代码呈现它从XMLWorker接收到的内容。因此,要么我的XMLWorker用法不正确,要么输入错误。但是,缩放代码本身(即
循环的
)应该是正确的。

您说您填充了richtext字段。在我看来,它更像是在字段所在的位置将文本标记在常规页面内容上。填充字段通常包括向字段本身及其小部件注释添加内容……我更改了语言,您是对的。我在richtext字段上打上印记,因为我认为没有更好的方法来填充richtext字段。如果我错了,请告诉我。谢谢你指出这一点。我认为没有更好的方法来填写richtext字段。-理论上应该有,但我还没有认真处理这项任务。也就是说,如果这种填充方式适合您,您可以缩放坐标系以使其适合。基本上,您已经保留了一个带有富文本字段的区域,并希望使一些富文本内容适合该区域,对吗?是的,该区域已定义,富文本内容只是覆盖在其上的一个戳记。我想我的问题是如何缩放邮票场好吧,我想试试。您能否共享一个示例PDF(通过google drive或drop box公共共享)和一个富文本字符串
(大到足以引起问题)?
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);
            }
        }
    }
}