iText 7 PdfTextArray 类中存在一个错误,该错误会生成与您类似的堆栈跟踪。不过,由于您不共享您的 PDF,我无法确定这是否是目前困扰您的错误。
虫子
这个 bug 很容易在 Java 中引发,就像这样
PdfTextArray textArray = new PdfTextArray();
textArray.add(1);
textArray.add(-1);
textArray.add(1);
(CancelingAdjustments 测试testCancelingAdjustments)
在 C# 中也是如此。
这基本上可能是 OP 的情况;编校涉及从此类文本数组中删除文本片段并通过等效的数字调整进行替换,因此在编校期间这种情况可能比一般情况下更可能发生。
原因
将多个数字添加到PdfTextArray 时,它会尝试将它们组合成一个数字,如果该单个数字为零,则将其完全删除:
public boolean add(float number) {
// adding zero doesn't modify the TextArray at all
if (number != 0) {
if (!Float.isNaN(lastNumber)) {
lastNumber = number + lastNumber;
if (lastNumber != 0) {
set(size() - 1, new PdfNumber(lastNumber));
} else {
remove(size() - 1);
}
} else {
lastNumber = number;
super.add(new PdfNumber(lastNumber));
}
lastString = null;
return true;
}
return false;
}
(PdfTextArray 方法add)
但由于取消,此代码在删除后忘记将 lastNumber 变量重置为“非数字”。因此,这个错误可以这样修复:
public boolean add(float number) {
// adding zero doesn't modify the TextArray at all
if (number != 0) {
if (!Float.isNaN(lastNumber)) {
lastNumber = number + lastNumber;
if (lastNumber != 0) {
set(size() - 1, new PdfNumber(lastNumber));
} else {
remove(size() - 1);
lastNumber = Float.NaN;
}
} else {
lastNumber = number;
super.add(new PdfNumber(lastNumber));
}
lastString = null;
return true;
}
return false;
}
(可以通过测试数组的最后一个位置是否有一些字符串并相应地初始化lastString来进一步改进这一点。)
这里的 iText/.Net 代码非常相似。