Pdf 如果字段标记为多行,则.NET的iText 7将忽略并重置文本对齐方式

Pdf 如果字段标记为多行,则.NET的iText 7将忽略并重置文本对齐方式,pdf,itext,itext7,Pdf,Itext,Itext7,我正在使用iText 7 for.NET实现PDF创建,从iTextSharp 5.5.12升级,一切都很好,比以前的版本简单得多,速度也快得多,但是,我想我发现了一个bug 具体地说,当使用预先存在的带有表单字段的PDF并进行填充时,如果该字段标记为多行,则会忽略任何预设或替代的文本对齐方式,并且文本始终保持左对齐。如果我将该字段取消标记为多行,则将遵循预设对齐方式 有人知道解决这个问题的方法吗?谢谢 这确实是iText 7中的一个bug。我认为仅仅使用您自己的代码很难解决这个问题。在iTex

我正在使用iText 7 for.NET实现PDF创建,从iTextSharp 5.5.12升级,一切都很好,比以前的版本简单得多,速度也快得多,但是,我想我发现了一个bug

具体地说,当使用预先存在的带有表单字段的PDF并进行填充时,如果该字段标记为多行,则会忽略任何预设或替代的文本对齐方式,并且文本始终保持左对齐。如果我将该字段取消标记为多行,则将遵循预设对齐方式


有人知道解决这个问题的方法吗?谢谢

这确实是iText 7中的一个bug。我认为仅仅使用您自己的代码很难解决这个问题。在iText 7中没有修复错误的情况下,能够对多行字段使用对齐的最简单方法可能是自己修复问题并从源代码构建二进制文件

请看一下实现。这里我采用了最新的开发版本,但是可以根据
主版本
或任何其他版本进行修复

感兴趣的方法是
DrawMultiletextAppearance
。您可以看到创建了
Canvas
实例,并将
段落
实例添加到
画布
。任何地方都没有提到理由!这是我们应该修理的地方。首先,我们应该将
PdfFormField
justification
属性转换为
layout
模块的
TextAlignment
属性,以后可以在
段落上使用该属性:

Integer justification = getJustification();
if (justification == null) {
    justification = 0;
}
TextAlignment textAlignment = TextAlignment.LEFT;
if (justification == ALIGN_RIGHT) {
    textAlignment = TextAlignment.RIGHT;
} else if (justification == ALIGN_CENTER) {
    textAlignment = TextAlignment.CENTER;
}
我们差不多完成了!剩下的是设置段落的
TextAlignment
。确保在将
段落添加到
画布之前执行此操作:

// This line was already there
Paragraph paragraph = new Paragraph(strings.get(index)).setFont(font).setFontSize(fontSize).setMargins(0, 0, 0, 0).setMultipliedLeading(1);
// This is the new line we are adding to fix the alignment problem
paragraph.setTextAlignment(textAlignment);
完整的代码:

// The block below was already there:
Paragraph paragraph = new Paragraph(strings.get(index)).setFont(font).setFontSize(fontSize).setMargins(0, 0, 0, 0).setMultipliedLeading(1);
paragraph.setProperty(Property.FORCED_PLACEMENT, true);

// These are the new lines
Integer justification = getJustification();
if (justification == null) {
    justification = 0;
}
TextAlignment textAlignment = TextAlignment.LEFT;
if (justification == ALIGN_RIGHT) {
    textAlignment = TextAlignment.RIGHT;
} else if (justification == ALIGN_CENTER) {
    textAlignment = TextAlignment.CENTER;
}
paragraph.setTextAlignment(textAlignment);
就这样!剩下要做的是使用
mvn包构建模块
/
mvn安装
。有关建筑的更多信息,请参阅
BUILDING.md

这些说明是针对Java的,但是如果您使用的是
.NET
版本,那么基本上是相同的,只是构建步骤不同


iText是一款开源产品,因此请不要害怕探索代码和玩弄。

这确实是iText 7中的一个bug。我认为仅仅使用您自己的代码很难解决这个问题。在iText 7中没有修复错误的情况下,能够对多行字段使用对齐的最简单方法可能是自己修复问题并从源代码构建二进制文件

请看一下实现。这里我采用了最新的开发版本,但是可以根据
主版本
或任何其他版本进行修复

感兴趣的方法是
DrawMultiletextAppearance
。您可以看到创建了
Canvas
实例,并将
段落
实例添加到
画布
。任何地方都没有提到理由!这是我们应该修理的地方。首先,我们应该将
PdfFormField
justification
属性转换为
layout
模块的
TextAlignment
属性,以后可以在
段落上使用该属性:

Integer justification = getJustification();
if (justification == null) {
    justification = 0;
}
TextAlignment textAlignment = TextAlignment.LEFT;
if (justification == ALIGN_RIGHT) {
    textAlignment = TextAlignment.RIGHT;
} else if (justification == ALIGN_CENTER) {
    textAlignment = TextAlignment.CENTER;
}
我们差不多完成了!剩下的是设置段落的
TextAlignment
。确保在将
段落添加到
画布之前执行此操作:

// This line was already there
Paragraph paragraph = new Paragraph(strings.get(index)).setFont(font).setFontSize(fontSize).setMargins(0, 0, 0, 0).setMultipliedLeading(1);
// This is the new line we are adding to fix the alignment problem
paragraph.setTextAlignment(textAlignment);
完整的代码:

// The block below was already there:
Paragraph paragraph = new Paragraph(strings.get(index)).setFont(font).setFontSize(fontSize).setMargins(0, 0, 0, 0).setMultipliedLeading(1);
paragraph.setProperty(Property.FORCED_PLACEMENT, true);

// These are the new lines
Integer justification = getJustification();
if (justification == null) {
    justification = 0;
}
TextAlignment textAlignment = TextAlignment.LEFT;
if (justification == ALIGN_RIGHT) {
    textAlignment = TextAlignment.RIGHT;
} else if (justification == ALIGN_CENTER) {
    textAlignment = TextAlignment.CENTER;
}
paragraph.setTextAlignment(textAlignment);
就这样!剩下要做的是使用
mvn包构建模块
/
mvn安装
。有关建筑的更多信息,请参阅
BUILDING.md

这些说明是针对Java的,但是如果您使用的是
.NET
版本,那么基本上是相同的,只是构建步骤不同


iText是一个开源产品,所以请不要害怕探索代码和玩弄。我相信这是正确的解决方案,但我选择了用一段文字来代替字段,它成功了。我将保留该解决方案,直到错误得到修复。谢谢你的帮助!我相信这是正确的解决方案,但我选择了用一个段落来代替这个字段,结果奏效了。我将保留该解决方案,直到错误得到修复。谢谢你的帮助!