如果字段标记为多行,iText 7 for .NET 会忽略并重置文本对齐方式
iText 7 for .NET Ignores and Resets Text Alignment if a Field is Marked as Multi-line
我正在使用 iText 7 for .NET 创建 PDF,从 iTextSharp 5.5.12 升级,一切都很好,而且它比以前的版本简单得多,速度也快得多,但是,我想我'我发现了一个错误。
具体来说,当使用带有表单字段的现有 PDF 并填写时,如果该字段被标记为多行,那么任何预设或覆盖的文本对齐方式都会被忽略,并且文本始终保持左对齐。如果我取消将该字段标记为多行,则预设对齐方式有效。
有谁知道解决这个问题的方法吗?谢谢!
这确实是 iText 7 中的一个错误。我认为仅使用您自己的代码很难解决这个问题。在 iText 7 中未修复错误时能够对多行字段使用对齐的最简单方法可能是自己修复问题并从源代码构建二进制文件。
查看 PdfFormField 实施。我在这里使用了最新的开发版本,但如果您愿意,可以根据 master
或任何其他版本随意修复。
感兴趣的方法是drawMultiLineTextAppearance
。您可以看到 Canvas
个实例已创建,并且 Paragraph
个实例已添加到 Canvas
。任何地方都没有提到理由!这是我们应该修复的地方。首先,我们应该将 PdfFormField
的 justification
属性 转换为 layout
模块的 TextAlignment
属性 ,以后可以在 Paragraph
:
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
。一定要在 Paragraph
添加到 Canvas
:
之前完成
// 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 package
/ mvn install
构建模块。另请参阅 BUILDING.md
了解有关建筑的更多信息。
说明是针对 Java 的,但是如果您使用的是 .NET
版本,那么基本上是一样的,只是构建步骤会有所不同。
iText 是一个开源产品,所以请不要害怕探索代码和尝试。
我正在使用 iText 7 for .NET 创建 PDF,从 iTextSharp 5.5.12 升级,一切都很好,而且它比以前的版本简单得多,速度也快得多,但是,我想我'我发现了一个错误。
具体来说,当使用带有表单字段的现有 PDF 并填写时,如果该字段被标记为多行,那么任何预设或覆盖的文本对齐方式都会被忽略,并且文本始终保持左对齐。如果我取消将该字段标记为多行,则预设对齐方式有效。
有谁知道解决这个问题的方法吗?谢谢!
这确实是 iText 7 中的一个错误。我认为仅使用您自己的代码很难解决这个问题。在 iText 7 中未修复错误时能够对多行字段使用对齐的最简单方法可能是自己修复问题并从源代码构建二进制文件。
查看 PdfFormField 实施。我在这里使用了最新的开发版本,但如果您愿意,可以根据 master
或任何其他版本随意修复。
感兴趣的方法是drawMultiLineTextAppearance
。您可以看到 Canvas
个实例已创建,并且 Paragraph
个实例已添加到 Canvas
。任何地方都没有提到理由!这是我们应该修复的地方。首先,我们应该将 PdfFormField
的 justification
属性 转换为 layout
模块的 TextAlignment
属性 ,以后可以在 Paragraph
:
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
。一定要在 Paragraph
添加到 Canvas
:
// 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 package
/ mvn install
构建模块。另请参阅 BUILDING.md
了解有关建筑的更多信息。
说明是针对 Java 的,但是如果您使用的是 .NET
版本,那么基本上是一样的,只是构建步骤会有所不同。
iText 是一个开源产品,所以请不要害怕探索代码和尝试。