Ethan – Great work.
However, I am concern about what version of the PDF Reference or ISO 32000 you
used to implement this? I see that you referred to the n0-n5 elements for the
appearance, but those have been deprecated for almost a decade now :(.
Also, you seem to be putting an appearance in a form that is off page
(50000++), which doesn't make any sense.
(and may be more issues, that's just the two that hit me first)
Leonard
From: "Ethan.Lee.W" <ethan.le...@gmail.com<mailto:ethan.le...@gmail.com>>
Reply-To: "Ethan.Lee.W" <ethan.le...@gmail.com<mailto:ethan.le...@gmail.com>>
Date: Monday, April 1, 2013 1:14 PM
To:
"podofo-users@lists.sourceforge.net<mailto:podofo-users@lists.sourceforge.net>"
<podofo-users@lists.sourceforge.net<mailto:podofo-users@lists.sourceforge.net>>
Subject: [Podofo-users] About Digital Signature
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 Objects
PdfObject* 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 path
void 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 signing
signField.SetSignatureDate( PdfDate() );
//add the Signature Appearance
signField.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 file
signer.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