hi:
my english is so bad.so,expression is not clear also hope forgive.
I made several modifications to podofo to correctly support digital
signature,multiple digital signature and add signature appearance.
it must be appended that pdf document update. so I made several modifications.
void PdfWriter::WritePdfObjects( PdfOutputDevice* pDevice, const PdfVecObjects&
vecObjects, PdfXRef* pXref ){ TCIVecObjects itObjects =
vecObjects.begin(); TCIPdfReferenceList itFree =
vecObjects.GetFreeObjects().begin(); while( itObjects != vecObjects.end() )
{//only write new Objects and modified ObjectsPdfObject* oldObject =
this->m_pOldDocParser->GetObjects()->GetObject((*itObjects)->Reference());std::string
strOldObject;if (oldObject !=
NULL){oldObject->ToString(strOldObject);std::string
strCurrObject;(*itObjects)->ToString(strCurrObject);if
(strCurrObject.compare(strOldObject) == 0){++itObjects;continue;}}
pXref->AddObject( (*itObjects)->Reference(), pDevice->Tell(), true ); //
Make sure that we do not encrypt the encryption dictionary!
(*itObjects)->WriteObject( pDevice, m_eWriteMode,
((*itObjects) == m_pEncryptObj ? NULL : m_pEncrypt) );
++itObjects; } while( itFree != vecObjects.GetFreeObjects().end() ) {
pXref->AddObject( *itFree, 0, false ); ++itFree; }}//add
Signature Appearance from image pathvoid
PdfSignatureField::CreateSignatureAppearance(const char *n2Path){if(
!m_pWidget->HasAppearanceStream() ){PdfRect rect(0,0,
m_pWidget->GetRect().GetWidth(),m_pWidget->GetRect().GetHeight());PdfXObject
xobjAPN(rect,m_pObject->GetOwner());PdfXObject
xobjFRM(rect,xobjAPN.GetObject()->GetOwner(),"FRM");PdfXObject
xobjN0(rect,xobjFRM.GetObject()->GetOwner(),"n0");PdfXObject
xobjN1(rect,xobjFRM.GetObject()->GetOwner(),"n1");PdfXObject
xobjN2(rect,xobjFRM.GetObject()->GetOwner(),"n2");PdfXObject
xobjN3(rect,xobjFRM.GetObject()->GetOwner(),"n3");PdfXObject
xobjN4(rect,xobjFRM.GetObject()->GetOwner(),"n4"); PdfImage
n2Image(rect,xobjN2.GetObject()->GetOwner(),"img");n2Image.LoadFromPng(n2Path);n2Image.SetImageChromaKeyMask(0,0,0);
//PdfImage
n3Image(rect,xobjN3.GetObject()->GetOwner(),"img");//n3Image.LoadFromPng("e:\\x.png");//n3Image.SetImageChromaKeyMask(0,0,0);
PdfPainter painter;
painter.SetPage(&xobjAPN);painter.DrawXObject(rect.GetLeft(),rect.GetBottom(),&xobjFRM);painter.FinishPage();
painter.SetPage(&xobjFRM);painter.DrawXObject(rect.GetLeft(),rect.GetBottom(),&xobjN0);painter.DrawXObject(rect.GetLeft(),rect.GetBottom(),&xobjN1);painter.DrawXObject(rect.GetLeft(),rect.GetBottom(),&xobjN2);painter.DrawXObject(rect.GetLeft(),rect.GetBottom(),&xobjN3);painter.DrawXObject(rect.GetLeft(),rect.GetBottom(),&xobjN4);painter.FinishPage();
painter.SetPage( &xobjN2
);painter.DrawImage(rect.GetLeft(),rect.GetBottom(),&n2Image,rect.GetWidth() /
n2Image.GetWidth(),rect.GetHeight() / n2Image.GetHeight()
);painter.FinishPage(); PdfDictionary dictN; dictN.AddKey( "N",
xobjAPN.GetObject()->Reference()
);m_pWidget->GetObject()->GetDictionary().AddKey( "AP", dictN
);//m_pWidget->SetAppearanceStream(&xobjImage);//pWidget->SetAppearanceStream(
&xObj );} } void CreateSimpleForm( PdfPage* pPage, PdfDocument* pDoc, const
PdfData &signatureData,const char *imagePath ){PdfSignatureField signField(
pPage, PdfRect( 50000 * CONVERSION_CONSTANT, 50000 * CONVERSION_CONSTANT,
50000 * CONVERSION_CONSTANT, 50000 *
CONVERSION_CONSTANT ), pDoc );srand(unsigned(time(0)));#define random(x)
(rand()%x)int rad = random(10000);char
signaFieldName[20];sprintf(signaFieldName,"signatureName%d",rad);
signField.SetFieldName(signaFieldName);signField.SetSignature(signatureData);signField.SetSignatureReason("I
agree");// Set time of signingsignField.SetSignatureDate( PdfDate() ); //add
the Signature AppearancesignField.CreateSignatureAppearance(imagePath);} int
main( int argc, char* argv[] ) {testCxImage();return 0; PdfFileInputStream
fileStream("e:\\hello.pdf");char *streamf = new
char[fileStream.GetFileLength()];size_t org =
fileStream.GetFileLength();fileStream.Read(streamf,org); PdfPage*
pPage;PdfPainter painter;PdfSignOutputDevice signer("e:\\hello - 123.pdf");char
dbuff[1024] = {0};int rlen = 0; signer.Write(streamf,org); if
(!signer.HasSignaturePosition()){signer.SetSignatureSize(1024 * 8);}
PdfMemDocument memSigner;memSigner.Load(streamf,org); PdfAcroForm *pAcroForm =
memSigner.GetAcroForm(ePdfCreateObject,
PdfAcroForm::ePdfAcroFormDefaultAppearance_None);pPage = memSigner.GetPage(0);
CreateSimpleForm(pPage, &memSigner,
*signer.GetSignatureBeacon(),"e:\\鼓楼地税.png");memSigner.Write(&signer); //size_t
ss = signer.GetSignatureSize();//size_t sp = signer.GetLength(); // Check if
position of signature was found if(signer.HasSignaturePosition()) {// Adjust
ByteRange for signature signer.AdjustByteRange();// Read data for
signature and count it// We have to seek at the beginning of the
filesigner.Seek(0);char buff[1024];DWORD len;DWORD inSize = 0;char * data;BYTE
* pSignature = NULL;DWORD size;while( (len = signer.ReadForSignature(buff,
1024))>0 ){inSize = inSize + len;}signer.Seek(0);data = new char[inSize];len =
signer.ReadForSignature(data,inSize); SignMessage((BYTE
*)data,inSize,pSignature,size);char sig_buf[1024] = {0};if (data !=
NULL){delete data;data = NULL;}signer.SetSignature(PdfData((char
*)pSignature,size));if (pSignature != NULL){free(pSignature);pSignature =
NULL;} }signer.Flush(); return 0;}
Ethan.Lee.W
------------------------------------------------------------------------------
Own the Future-Intel® Level Up Game Demo Contest 2013
Rise to greatness in Intel's independent game demo contest.
Compete for recognition, cash, and the chance to get your game
on Steam. $5K grand prize plus 10 genre and skill prizes.
Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d
_______________________________________________
Podofo-users mailing list
Podofo-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/podofo-users