Dear Patrick,
I downloaded the developer drop and tested a little bit. Reloading of the annotations seems better now. Unfortunatly I'am not able to change the once made annotations. If I reload them in the viewer I have to made a new annotation first. After that I'am able to change or delete the old ones. After saving these changed annotations I tried to reload them a second time but this failed with the following stacktrace:
22.07.2013 10:40:51 org.icepdf.core.pobjects.Catalog <clinit>
INFO: ICEsoft ICEpdf Core 5.0.1
22.07.2013 10:40:51 org.icepdf.core.pobjects.fonts.nfont.Font <clinit>
INFO: ICEsoft ICEpdf Pro 5.0.1
22.07.2013 10:41:02 org.icepdf.core.util.Parser getObject
WARNUNG: IO reading error.
22.07.2013 10:41:02 org.icepdf.core.util.content.NContentParser parse
WARNUNG: Error parsing content stream.
java.util.EmptyStackException
at java.util.Stack.peek(Unknown Source)
at java.util.Stack.pop(Unknown Source)
at org.icepdf.core.util.content.AbstractContentParser.consume_d(AbstractContentParser.java:642)
at org.icepdf.core.util.content.NContentParser.parse(Unknown Source)
at org.icepdf.core.pobjects.Form.init(Form.java:168)
at org.icepdf.core.pobjects.annotations.Annotation.init(Annotation.java:643)
at org.icepdf.core.pobjects.annotations.MarkupAnnotation.init(MarkupAnnotation.java:172)
at org.icepdf.core.pobjects.annotations.TextMarkupAnnotation.init(TextMarkupAnnotation.java:150)
at test.MySwingController.loadExternalObjects(MySwingController.java:223)
at test.MySwingController.openURL(MySwingController.java:187)
at org.icepdf.ri.common.SwingController$8.run(SwingController.java:3672)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
22.07.2013 10:41:02 org.icepdf.core.util.content.NContentParser parse
WARNUNG: Error parsing content stream.
java.util.EmptyStackException
at java.util.Stack.peek(Unknown Source)
at java.util.Stack.pop(Unknown Source)
at org.icepdf.core.util.content.AbstractContentParser.consume_K(AbstractContentParser.java:203)
at org.icepdf.core.util.content.NContentParser.parse(Unknown Source)
at org.icepdf.core.pobjects.Form.init(Form.java:168)
at org.icepdf.core.pobjects.annotations.Annotation.init(Annotation.java:643)
at org.icepdf.core.pobjects.annotations.MarkupAnnotation.init(MarkupAnnotation.java:172)
at org.icepdf.core.pobjects.annotations.TextMarkupAnnotation.init(TextMarkupAnnotation.java:150)
at test.MySwingController.loadExternalObjects(MySwingController.java:223)
at test.MySwingController.openURL(MySwingController.java:187)
at org.icepdf.ri.common.SwingController$8.run(SwingController.java:3672)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
This is my SwingController Implementation:
package test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import org.icepdf.core.io.RandomAccessFileInputStream;
import org.icepdf.core.io.SeekableInput;
import org.icepdf.core.pobjects.Dictionary;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.PObject;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.pobjects.StateManager;
import org.icepdf.core.util.IncrementalUpdater;
import org.icepdf.core.util.Library;
import org.icepdf.core.util.Parser;
import org.icepdf.ri.common.SwingController;
public class MySwingController extends SwingController {
public MySwingController()
{
super();
}
public void saveMarkupFile() throws Exception {
byte[][] updates = IncrementalUpdater.getUpdatedDocumentObjects(this
.getDocument());
String sFile = this.getDocument().getDocumentOrigin() + ".txt";
System.out.println("File: " + sFile);
FileOutputStream fileOutputStream = new FileOutputStream(sFile);
for (byte[] update : updates)
{
fileOutputStream.write(update);
}
fileOutputStream.close();
}
@Override
public void saveFile() {
if (!this.getDocument().getStateManager().isChanged()
&& !Document.foundIncrementalUpdater)
{
org.icepdf.ri.util.Resources.showMessageDialog(this
.getViewerFrame(), JOptionPane.INFORMATION_MESSAGE, this
.getMessageBundle(),
"viewer.dialog.saveAs.noUpdates.title",
"viewer.dialog.saveAs.noUpdates.msg");
return;
}
try
{
saveMarkupFile();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void openURL() {
try {
this.loadExternalObjects();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void loadExternalObjects() {
try {
SeekableInput rafis = RandomAccessFileInputStream.build(new File(
this.getDocument().getDocumentOrigin() + ".txt"));
Document document = this.getDocument();
Library library = document.getCatalog().getLibrary();
StateManager stateManager = library.getStateManager();
Parser parser = new Parser(rafis);
ArrayList<PObject> libraryObjects = new ArrayList<PObject>();
PObject object;
for (Object streamObject = parser.getObject(library); streamObject != null; streamObject = parser
.getObject(library))
{
object = (PObject) streamObject;
stateManager.addChange(object);
library.addObject(object.getObject(), object.getReference());
libraryObjects.add((PObject) streamObject);
}
// re-initialized page's and the annotations
document.getPageTree().resetInitializedState();
for (PObject pObject : libraryObjects) {
Object tmp = pObject.getObject();
if (tmp instanceof Page)
{
((Page) tmp).resetInitializedState();
}
if (tmp instanceof Dictionary)
{
((Dictionary) tmp).init();
}
}
rafis.close();
} catch (FileNotFoundException e)
{
e.printStackTrace();
return;
}
catch (Exception e)
{
e.printStackTrace();
}
this.updateDocumentView();
}
}
annotations created on pages 2 and 3 of the sample document. different types of annotations created. these annotations are saved in reader_overview.pdf.txt