首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PDFClown将表单扁平化抛出IndexOutOfBounds异常

使用PDFClown将表单扁平化抛出IndexOutOfBounds异常
EN

Stack Overflow用户
提问于 2015-08-11 21:15:57
回答 1查看 395关注 0票数 1

我正在使用PDFClown-0.2.0来扁平 pdf文件。这是我的代码:

代码语言:javascript
复制
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提供的指示。但是,当我运行代码时,会得到以下错误:

代码语言:javascript
复制
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生成的,我已经使表单字段成为只读的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-12 09:05:36

在代码中调试之后,它看起来就像一个PdfClown错误:

Iterator返回的org.pdfclown.documents.interaction.forms.FieldWidgets.iterator()不认识到下面的小部件集合发生了变化(变得越来越小),因此尝试读取超出其大小的信息。

详细情况:

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

代码语言:javascript
复制
  for(Widget widget : field.getWidgets())

但是在这个循环中,它从当前字段的Kids中移除当前小部件:

代码语言:javascript
复制
    // Removing the field references relating the widget...
    PdfDictionary fieldPartDictionary = widget.getBaseDataObject();
    while (fieldPartDictionary != null)
    {
      [...]
      kidsArray.remove(fieldPartDictionary.getReference());
      [...]
    }

因此,外部for迭代的集合会发生变化。不幸的是,此处使用的Iterator不知道基集合中的更改。

代码语言:javascript
复制
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实现对于可以通过体系结构或契约强制执行的不可更改的集合来说是可以的。但在这里的例子中,我看不出两种情况,体系结构显然允许集合改变,而且没有迹象表明所讨论的迭代器可能只用于稳定的基本集合。

这个应该修好。

解决方法

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

代码语言:javascript
复制
  for(Widget widget : field.getWidgets())

使用

代码语言:javascript
复制
  List<Widget> widgets = new ArrayList<Widget>(field.getWidgets());
  for(Widget widget : widgets)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31952089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档