Hello there,
We are working on a product that supports highlighting PDF documents. We
recently came across a situation where when trying to highlight a pdf that was
converted into a PDF from word by some third part library, threw
UnsupportedOperationException. It happened in Overlay.java.
private void collectLayoutPages( List pages) throws IOException
{
Iterator pagesIter = pages.iterator();
while( pagesIter.hasNext() )
{
PDPage page = (PDPage)pagesIter.next();
COSBase contents = page.getCOSDictionary().getDictionaryObject(
COSName.CONTENTS );
PDResources resources = page.findResources();
if( resources == null )
{
resources = new PDResources();
page.setResources( resources );
}
COSDictionary res = resources.getCOSDictionary();
if( contents instanceof COSStream )
{
COSStream stream = (COSStream) contents;
Map objectNameMap = new TreeMap();
stream = makeUniqObjectNames(objectNameMap, stream);
layoutPages.add(new LayoutPage(stream, res, objectNameMap));
}
else if( contents instanceof COSArray )
{
throw new UnsupportedOperationException("Layout pages with
COSArray currently not supported.");
// layoutPages.add(new LayoutPage(contents, res));
}
else
{
throw new IOException( "Contents are unknown type:" +
contents.getClass().getName() );
}
}
}
Below is the exception:
ava.lang.UnsupportedOperationException: Layout pages with COSArray currently
not supported.
at org.apache.pdfbox.Overlay.collectLayoutPages(Overlay.java:269)
at org.apache.pdfbox.Overlay.overlay(Overlay.java:224)
at
com.thoughtcorp.annotation.AnnotatedFile.applyAnnotationsToPDF(AnnotatedFile.java:54)
at
com.thoughtcorp.services.SyncAnnotationsService.syncAnnotations(SyncAnnotationsService.java:26)
at com.thoughtcorp.SyncRequestHandler.handle(SyncRequestHandler.java:60)
at
org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:47)
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
at org.eclipse.jetty.server.Server.handle(Server.java:346)
at
org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:589)
at
org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1065)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:823)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:220)
at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:411)
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:535)
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:529)
at java.lang.Thread.run(Thread.java:662)
Can you please ask the developer who worked on the code highlighted above was
it not implemented coz it required a lot of work or was it coz he thought the
functionality would not be required by many people? We were thinking if we
could just implement LayoutPage.java to take in COSArray and operate on it.
Would it be too hard to implement to support our solution? Another approach was
to convert COSArray into COSStream so the code always catches if block.
We are currently trying to meet a deadline and this has become a road blocker
for us. Any help in this matter would be really appreciated!
Thanks,
Haris