Please accept this patch to fix PdfPage DeleteAnnotation. I've added a test
case to PageTest, you can verify the existence of this bug by running the
test before applying the changes to PdfPage.cpp.

Thank you,
Cory Mickelson
Index: src/doc/PdfPage.cpp
===================================================================
--- src/doc/PdfPage.cpp (revision 1928)
+++ src/doc/PdfPage.cpp (working copy)
@@ -409,7 +409,7 @@
 void PdfPage::DeleteAnnotation( int index )
 {
     PdfObject* pObj = this->GetAnnotationsArray( false );
-    PdfObject* pItem;
+    PdfObject pItem;
 
     if( !(pObj && pObj->IsArray()) )
     {
@@ -421,9 +421,9 @@
         PODOFO_RAISE_ERROR( ePdfError_ValueOutOfRange );
     }
 
-    pItem = &(pObj->GetArray()[index]);
+    pItem = pObj->GetArray()[index];
 
-    if( pItem->IsDictionary() )
+    if( pItem.IsDictionary() )
     {
         PdfAnnotation* pAnnot;
 
@@ -430,16 +430,16 @@
         pObj->GetArray().erase( pObj->GetArray().begin() + index );
 
         // delete any cached PdfAnnotations
-        pAnnot = m_mapAnnotationsDirect[pItem];
+        pAnnot = m_mapAnnotationsDirect[&pItem];
         if( pAnnot )
         {
             delete pAnnot;
-            m_mapAnnotationsDirect.erase( pItem );
+            m_mapAnnotationsDirect.erase( &pItem );
         }
     }
     else
     {
-        this->DeleteAnnotation( pItem->GetReference() );
+        this->DeleteAnnotation( pItem.GetReference() );
     }
 }
 
Index: test/unit/PageTest.cpp
===================================================================
--- test/unit/PageTest.cpp      (revision 1928)
+++ test/unit/PageTest.cpp      (working copy)
@@ -26,53 +26,62 @@
 using namespace PoDoFo;
 
 // Registers the fixture into the 'registry'
-CPPUNIT_TEST_SUITE_REGISTRATION( PageTest );
+CPPUNIT_TEST_SUITE_REGISTRATION(PageTest);
 
-void PageTest::setUp()
-{
-}
+void
+PageTest::setUp()
+{}
 
-void PageTest::tearDown()
-{
-}
+void
+PageTest::tearDown()
+{}
 
-void PageTest::testEmptyContents()
+void
+PageTest::testEmptyContents()
 {
-    PdfVecObjects vecObjects;
-    PdfObject object( PdfReference( 1, 0 ), "Page" );
-    vecObjects.push_back( &object );
+    PdfVecObjects vecObjects;
+    PdfObject object(PdfReference(1, 0), "Page");
+    vecObjects.push_back(&object);
 
-    const std::deque<PdfObject*> parents;
-    PdfPage page( &object, parents );
-    CPPUNIT_ASSERT( NULL != page.GetContents() );
-    
+    const std::deque<PdfObject*> parents;
+    PdfPage page(&object, parents);
+    CPPUNIT_ASSERT(NULL != page.GetContents());
 }
 
-void PageTest::testEmptyContentsStream()
+void
+PageTest::testEmptyContentsStream()
 {
-    PdfMemDocument doc;
-    PdfPage*       pPage = doc.CreatePage( PdfPage::CreateStandardPageSize( 
ePdfPageSize_A4 ) );
-    PdfAnnotation* pAnnot = pPage->CreateAnnotation( ePdfAnnotation_Popup, 
PdfRect( 300.0, 20.0, 250.0, 50.0 ) );
-    PdfString      sTitle("Author: Dominik Seichter");
-    pAnnot->SetContents( sTitle );
-    pAnnot->SetOpen( true );
+    PdfMemDocument doc;
+    PdfPage* pPage =
+    doc.CreatePage(PdfPage::CreateStandardPageSize(ePdfPageSize_A4));
+    PdfAnnotation* pAnnot = pPage->CreateAnnotation(
+      ePdfAnnotation_Popup, PdfRect(300.0, 20.0, 250.0, 50.0));
+    PdfString sTitle("Author: Dominik Seichter");
+    pAnnot->SetContents(sTitle);
+    pAnnot->SetOpen(true);
+    PdfTextField pTextField(pPage,PdfRect(100.0,100.0, 50.0, 50.0),&doc);
+    pTextField.SetFieldName("Test");
+    PdfTextField pTextField1(pPage,PdfRect(100.0,100.0, 50.0, 50.0),&doc);
+    pTextField.SetFieldName("Test");
+    std::string sFilename = TestUtils::getTempFilename();
+    doc.Write(sFilename.c_str());
 
-    std::string sFilename = TestUtils::getTempFilename();
-    doc.Write( sFilename.c_str() );
+    // Read annotation again
+    PdfMemDocument doc2(sFilename.c_str());
+    CPPUNIT_ASSERT_EQUAL(1, doc2.GetPageCount());
+    PdfPage* pPage2 = doc2.GetPage(0);
+    CPPUNIT_ASSERT(NULL != pPage2);
+    CPPUNIT_ASSERT_EQUAL(3, pPage2->GetNumAnnots());
+    PdfAnnotation* pAuthorAnnot = pPage2->GetAnnotation(0);
+    CPPUNIT_ASSERT(NULL != pAuthorAnnot);
+    CPPUNIT_ASSERT(sTitle == pAuthorAnnot->GetContents());
+    PdfObject* pPageObject = pPage2->GetObject();
+    CPPUNIT_ASSERT(!pPageObject->GetDictionary().HasKey("Contents"));
 
-    // Read annotation again
-    PdfMemDocument doc2( sFilename.c_str() );
-    CPPUNIT_ASSERT_EQUAL( 1, doc2.GetPageCount() );
-    PdfPage* pPage2 = doc2.GetPage( 0 );
-    CPPUNIT_ASSERT( NULL != pPage2 );
-    CPPUNIT_ASSERT_EQUAL( 1, pPage2->GetNumAnnots() );
-    PdfAnnotation* pAnnot2 = pPage2->GetAnnotation( 0 );
-    CPPUNIT_ASSERT( NULL != pAnnot2 );
-    CPPUNIT_ASSERT( sTitle == pAnnot2->GetContents() );
+    //Remove annotations
+    pPage2->DeleteAnnotation(1);
+    CPPUNIT_ASSERT_NO_THROW(pPage2->GetField(0));
 
-    PdfObject* pPageObject = pPage2->GetObject();        
-    CPPUNIT_ASSERT( !pPageObject->GetDictionary().HasKey("Contents") );
-
-    TestUtils::deleteFile( sFilename.c_str() );
+    TestUtils::deleteFile(sFilename.c_str());
 }
 
Index: test/unit/PageTest.h
===================================================================
--- test/unit/PageTest.h        (revision 1928)
+++ test/unit/PageTest.h        (working copy)
@@ -42,6 +42,7 @@
 
   void testEmptyContents();
   void testEmptyContentsStream();
+  void testDeleteAnnotation();
 };
 
 #endif // _PAGE_TEST_H_
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Podofo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/podofo-users

Reply via email to