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

时间:2018-01-13 01:54:52

标签: pdf itext itext7

我正在使用iText 7 for .NET实现PDF创建,从iTextSharp 5.5.12升级,一切都运行良好,它比以前的版本更简单,更快,但我认为我发现一个错误。

具体来说,当使用预先存在的PDF并在其上填写表单字段并填写它时,如果字段标记为多行,则忽略任何预设或覆盖的文本对齐,并且文本始终保持对齐。如果我将该字段取消标记为多行,则会预设对齐。

有没有人知道如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:6)

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

查看PdfFormField实施。在这里,我采用了最新的开发版本,但如果您愿意,可以根据master或任何其他版本进行修复。

感兴趣的方法是drawMultiLineTextAppearance。您可以看到Canvas实例已创建,Paragraph实例已添加到Canvas。在任何地方都没有提到理由!这是我们应该解决的问题。首先,我们应该将justification PdfFormField属性转换为TextAlignment模块的layout属性,该属性稍后可用于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是一个开源产品,所以请不要害怕探索代码并玩游戏。