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