iTextSharp v。5.5.3至5.5.6-错误展平文本字段

iTextSharp v。5.5.3至5.5.6-错误展平文本字段,itextsharp,textfield,Itextsharp,Textfield,我有个问题。我正在使用iTextV。(5.5.3至5.5.6)。 我有一个PDF文件和一页。 在侧面,我有4个文本字段(旋转:0、90、180、270)和一个红色多边形 我的页面旋转设置为270 我能把书页压平 在代码中,我设置 stamper.AnnotationFlattening = true; stamper.FormFlattening = true; 展平后,我的2个文本字段旋转不正确 原始PDF的图像1: 图2出现错误: PDF格式: 如果pdfStamper.AcroFie

我有个问题。我正在使用iTextV。(5.5.3至5.5.6)。 我有一个PDF文件和一页。 在侧面,我有4个文本字段(旋转:0、90、180、270)和一个红色多边形 我的页面旋转设置为270

我能把书页压平

在代码中,我设置

stamper.AnnotationFlattening = true;
stamper.FormFlattening = true;
展平后,我的2个文本字段旋转不正确

原始PDF的图像1:

图2出现错误:

PDF格式:

如果
pdfStamper.AcroFields.generateapearances
true,则在展平现有外观通过其矩阵属性旋转的表单字段时,iText(夏普)中存在一个问题

原著

使用
generateApearances==true展平后
如下所示:

变通办法 由于文档已经有外观流,您可以关闭
GenerateAppearances

stamper.AcroFields.GenerateAppearances = false;
stamper.AnnotationFlattening = true;
stamper.FormFlattening = true;
您现在得到的结果是:

问题 如果
generateApearances==true
,则iTextSharp(展平表单时)首先查看字段是否已出现。如果字段有一个,iTextSharp只会尝试将现有外观整齐地匹配到表单字段的矩形中。不幸的是,它(a)忽略了现有的表单字段矩阵条目,并且(b)用一个新的矩阵替换它进行拟合。如果通过其矩阵旋转外观,则该旋转将丢失,相反,该值将拉伸以适合错误定向的矩形

if (acroFields.GenerateAppearances) {
    if (appDic == null || as_n == null) {
        [...]
    } else if (as_n.IsStream()) {
        PdfStream stream = (PdfStream) as_n;
        PdfArray bbox = stream.GetAsArray(PdfName.BBOX);
        PdfArray rect = merged.GetAsArray(PdfName.RECT);
        if (bbox != null && rect != null) {
            float rectWidth = rect.GetAsNumber(2).FloatValue - rect.GetAsNumber(0).FloatValue;
            float bboxWidth = bbox.GetAsNumber(2).FloatValue - bbox.GetAsNumber(0).FloatValue;
            float rectHeight = rect.GetAsNumber(3).FloatValue - rect.GetAsNumber(1).FloatValue;
            float bboxHeight = bbox.GetAsNumber(3).FloatValue - bbox.GetAsNumber(1).FloatValue;
            float widthCoef = Math.Abs(bboxWidth != 0 ? rectWidth / bboxWidth : float.MaxValue);
            float heightCoef = Math.Abs(bboxHeight != 0 ? rectHeight / bboxHeight : float.MaxValue);

            if (widthCoef != 1 || heightCoef != 1)
            {
                NumberArray array = new NumberArray(widthCoef, 0, 0, heightCoef, 0, 0);
                stream.Put(PdfName.MATRIX, array);
                MarkUsed(stream);
            }
        }
    }
}
PdfStamperImp
方法
FlatFields

背景 iTextSharp忽略外观矩阵的原因是表单填充过程中的外观生成不应使用此类矩阵值:

对于非富文本字段,外观流与所有外观流一样,是一个表单XObject,其表单字典的内容初始化如下:

  • 资源字典(Resources)应使用交互式表单字典的DR条目中的资源创建(见表218)

  • 边界框的左下角(BBox)设置为表单坐标系中的坐标(0,0)。框的顶部和右侧坐标取自注释矩形的尺寸(小部件注释字典中的Rect条目)

  • 外观流的表单字典中的所有其他条目都设置为其默认值(见8.10,“表单XObject”)

(第12.7.3.3节“可变文本”)

这意味着对于矩阵

矩阵数组(可选)一个由六个数字组成的数组,用于指定表单矩阵,将表单空间映射到用户空间(参见8.3.4,“转换矩阵”)。默认值:标识矩阵[1 0 1 0]

(表95–第8.10.2节“表格字典”中针对类型1表格字典的附加条目)

因此,可以假设在根据规范填充期间创建的表单字段外观流具有恒等式矩阵值,并且没有旋转


因此,iTextSharp中的问题实际上只是反映了一种假设,即表单字段外观是由于表单填写而生成的。

请共享有问题的PDF。您可以通过公共共享(例如,在google drive或dropbox上)进行此操作,并在此处发布链接。将链接添加到文件PDF我在回答中提到的工作是否适用于您?是的。它起作用了。谢谢