gpt4 book ai didi

java - 使用 PDFClown 展平表单会引发 IndexOutOfBounds 异常

转载 作者:行者123 更新时间:2023-11-30 03:18:24 26 4
gpt4 key购买 nike

我正在使用 PDFClown-0.2.0 进行拼合 this pdf 文件。这是我的代码:

import org.pdfclown.documents.Document;
import org.pdfclown.files.File;
import org.pdfclown.files.SerializationModeEnum;
import org.pdfclown.tools.FormFlattener;

public class Sample {
public static void main(String args[]){
try {
File f = new File("label.pdf");
Document doc = f.getDocument();

FormFlattener formFlattener = new FormFlattener();
formFlattener.flatten(doc);
f.save(SerializationModeEnum.Standard);
} catch (Exception e) {
e.printStackTrace();
}
}
}

我正在按照 http://pdfclown.org/2014/09/12/waiting-for-pdf-clown-0-2-0-release/#FormFlattening 提供的说明进行操作。但是,当我运行代码时,出现以下错误:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at org.pdfclown.objects.PdfArray.get(PdfArray.java:314)
at org.pdfclown.documents.interaction.forms.FieldWidgets.get(FieldWidgets.java:135)
at org.pdfclown.documents.interaction.forms.FieldWidgets$1.next(FieldWidgets.java:380)
at org.pdfclown.documents.interaction.forms.FieldWidgets$1.next(FieldWidgets.java:1)
at org.pdfclown.tools.FormFlattener.flatten(FormFlattener.java:74)
at com.narvar.webservices.returns.retailers.Sample.main(Sample.java:18)

我做错了什么?请注意,pdf 是使用 PDFBox 生成的,并且我已将表单字段设置为只读。

最佳答案

调试代码后,它看起来像一个 PdfClown bug:

Iterator返回者 org.pdfclown.documents.interaction.forms.FieldWidgets.iterator()无法识别下面的小部件集合已更改(变小),因此尝试读取超出其大小的内容。

详细信息:

org.pdfclown.tools.FormFlattener.flatten(Document)迭代字段的小部件:

  for(Widget widget : field.getWidgets())

但在此循环内,它会从当前字段的 Kids 中删除当前小部件:

    // Removing the field references relating the widget...
PdfDictionary fieldPartDictionary = widget.getBaseDataObject();
while (fieldPartDictionary != null)
{
[...]
kidsArray.remove(fieldPartDictionary.getReference());
[...]
}

因此,外部 for 所覆盖的集合迭代更改。不幸的是Iterator这里使用的是不知道基础集合的变化

return new Iterator<Widget>()
{
/** Index of the next item. */
private int index = 0;
/** Collection size. */
private final int size = size();

@Override
public boolean hasNext( )
{return (index < size);}

@Override
public Widget next( )
{
if(!hasNext()) throw new NoSuchElementException();
return get(index++);
}

@Override
public void remove( )
{throw new UnsupportedOperationException();}
};

正如你所见,它不仅不知道也不检查自己的基本集合,它甚至对集合大小有自己的想法,即 Iterator 处集合的大小。发电设置在size .

这样的Iterator对于不变的集合来说,实现是可以的,可以通过架构或契约(Contract)强制执行。但在这里的情况下,我看不到两者,该体系结构显然允许集合更改,并且没有任何迹象表明所讨论的迭代器可能仅用于稳定的基础集合。

这个问题应该得到解决。

解决方案

可以通过更改FormFlattener.flatten来尝试解决方案检索小部件的本地副本并迭代此副本,例如通过替换

  for(Widget widget : field.getWidgets())

  List<Widget> widgets = new ArrayList<Widget>(field.getWidgets());
for(Widget widget : widgets)

关于java - 使用 PDFClown 展平表单会引发 IndexOutOfBounds 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com