|
|
@ -33,6 +33,7 @@ class PdfSign: public QMainWindow, protected Ui::Pdfsign { |
|
|
|
if (fileName.isEmpty()) return; |
|
|
|
if (fileName.isEmpty()) return; |
|
|
|
_pdf = std::shared_ptr<Poppler::Document>(Poppler::Document::load(fileName)); |
|
|
|
_pdf = std::shared_ptr<Poppler::Document>(Poppler::Document::load(fileName)); |
|
|
|
showPage(); |
|
|
|
showPage(); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
public: |
|
|
|
public: |
|
|
|
void showPage(int pageNumber=0) { |
|
|
|
void showPage(int pageNumber=0) { |
|
|
@ -42,6 +43,47 @@ class PdfSign: public QMainWindow, protected Ui::Pdfsign { |
|
|
|
_pdfDisplay->setPixmap(QPixmap::fromImage(pdfPage->renderToImage())); |
|
|
|
_pdfDisplay->setPixmap(QPixmap::fromImage(pdfPage->renderToImage())); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void sign(QString filename) { |
|
|
|
|
|
|
|
PdfSigIncMemDocument doc(filename.c_str()); |
|
|
|
|
|
|
|
char *buffer = NULL; |
|
|
|
|
|
|
|
buffer = (char *)malloc(809600); |
|
|
|
|
|
|
|
PdfOutputDevice output(buffer, 809600); |
|
|
|
|
|
|
|
PdfSignOutputDevice signOutput(&output); |
|
|
|
|
|
|
|
signOutput.SetSignatureSize(2048); |
|
|
|
|
|
|
|
printf( "Page count:%d\n", doc.GetPageCount()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PdfSigIncSignatureField *sign = doc.GetSignatureField(); |
|
|
|
|
|
|
|
sign->SetSignatureDate(PdfDate()); |
|
|
|
|
|
|
|
sign->SetSignatureReason(L"I dont agree"); |
|
|
|
|
|
|
|
//sign->SetSignatureImage("e:\\sign.jpg", 0, 100, 200, 100, 100);
|
|
|
|
|
|
|
|
sign->SetSignatureText(L"Hello World", 0, 100, 200, 100, 100, 12); |
|
|
|
|
|
|
|
doc.Initialize(); |
|
|
|
|
|
|
|
doc.CreateVisualSign(); |
|
|
|
|
|
|
|
doc.Write(&signOutput); |
|
|
|
|
|
|
|
printf( "Has Signature:%d\n", signOutput.HasSignaturePosition()); |
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
char buff[809600] = {0}; |
|
|
|
|
|
|
|
size_t len; |
|
|
|
|
|
|
|
BYTE *Signature = NULL; |
|
|
|
|
|
|
|
DWORD cbSignature = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
signOutput.AdjustByteRange(); |
|
|
|
|
|
|
|
signOutput.Seek(0); |
|
|
|
|
|
|
|
len = signOutput.ReadForSignature(buff, 809600); |
|
|
|
|
|
|
|
printf("total tbs size: %d\n", len); |
|
|
|
|
|
|
|
SignMessage( (BYTE *)buff, len, &Signature, &cbSignature);//Digital signing using MSCAPI
|
|
|
|
|
|
|
|
printf("signature size: %d\n", cbSignature); |
|
|
|
|
|
|
|
const PoDoFo::PdfData *sig = new PoDoFo::PdfData((char *)Signature, cbSignature); |
|
|
|
|
|
|
|
signOutput.SetSignature(*sig); |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
signOutput.Flush(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FILE *fp = NULL; |
|
|
|
|
|
|
|
fp = fopen("/tmp/signed.pdf", "wb" ); |
|
|
|
|
|
|
|
fwrite( buffer, signOutput.GetLength(), 1, fp ); |
|
|
|
|
|
|
|
fclose(fp); |
|
|
|
|
|
|
|
free(buffer); |
|
|
|
|
|
|
|
} |
|
|
|
private: |
|
|
|
private: |
|
|
|
std::shared_ptr<Poppler::Document> _pdf; |
|
|
|
std::shared_ptr<Poppler::Document> _pdf; |
|
|
|
}; |
|
|
|
}; |
|
|
|