From eed9512c3c317c0117efe4dbacce80fb074d8487 Mon Sep 17 00:00:00 2001 From: YathavakrishnanMohan <169874568+YathavakrishnanMohan@users.noreply.github.com> Date: Thu, 4 Sep 2025 14:05:19 +0530 Subject: [PATCH 1/5] Added sample for E signing in PDF document using WPF PDFViewer --- Signature/Add_ESign/App.config | 6 + Signature/Add_ESign/App.xaml | 9 + Signature/Add_ESign/App.xaml.cs | 17 ++ .../Add_ESign/Data/DigitalSignatureBlock.png | Bin 0 -> 2669 bytes Signature/Add_ESign/Data/ESign.png | Bin 0 -> 5689 bytes Signature/Add_ESign/Data/Ink signature.pdf | Bin 0 -> 62542 bytes Signature/Add_ESign/Data/John.png | Bin 0 -> 2909 bytes Signature/Add_ESign/Data/PDF.pfx | Bin 0 -> 2582 bytes Signature/Add_ESign/MainWindow.xaml | 13 ++ Signature/Add_ESign/MainWindow.xaml.cs | 173 ++++++++++++++++++ Signature/Add_ESign/PDFViewer_WPF.csproj | 12 ++ Signature/Add_ESign/PDFViewer_WPF.sln | 25 +++ .../Add_ESign/Properties/AssemblyInfo.cs | 52 ++++++ .../Properties/Resources.Designer.cs | 71 +++++++ Signature/Add_ESign/Properties/Resources.resx | 117 ++++++++++++ .../Add_ESign/Properties/Settings.Designer.cs | 30 +++ .../Add_ESign/Properties/Settings.settings | 7 + Signature/Add_ESign/packages.config | 9 + .../Add_ESign/targets/MultiTargeting.targets | 10 + 19 files changed, 551 insertions(+) create mode 100644 Signature/Add_ESign/App.config create mode 100644 Signature/Add_ESign/App.xaml create mode 100644 Signature/Add_ESign/App.xaml.cs create mode 100644 Signature/Add_ESign/Data/DigitalSignatureBlock.png create mode 100644 Signature/Add_ESign/Data/ESign.png create mode 100644 Signature/Add_ESign/Data/Ink signature.pdf create mode 100644 Signature/Add_ESign/Data/John.png create mode 100644 Signature/Add_ESign/Data/PDF.pfx create mode 100644 Signature/Add_ESign/MainWindow.xaml create mode 100644 Signature/Add_ESign/MainWindow.xaml.cs create mode 100644 Signature/Add_ESign/PDFViewer_WPF.csproj create mode 100644 Signature/Add_ESign/PDFViewer_WPF.sln create mode 100644 Signature/Add_ESign/Properties/AssemblyInfo.cs create mode 100644 Signature/Add_ESign/Properties/Resources.Designer.cs create mode 100644 Signature/Add_ESign/Properties/Resources.resx create mode 100644 Signature/Add_ESign/Properties/Settings.Designer.cs create mode 100644 Signature/Add_ESign/Properties/Settings.settings create mode 100644 Signature/Add_ESign/packages.config create mode 100644 Signature/Add_ESign/targets/MultiTargeting.targets diff --git a/Signature/Add_ESign/App.config b/Signature/Add_ESign/App.config new file mode 100644 index 0000000..4b657bf --- /dev/null +++ b/Signature/Add_ESign/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Signature/Add_ESign/App.xaml b/Signature/Add_ESign/App.xaml new file mode 100644 index 0000000..21c06d5 --- /dev/null +++ b/Signature/Add_ESign/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/Signature/Add_ESign/App.xaml.cs b/Signature/Add_ESign/App.xaml.cs new file mode 100644 index 0000000..aa09e11 --- /dev/null +++ b/Signature/Add_ESign/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace PDFViewer_WPF +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/Signature/Add_ESign/Data/DigitalSignatureBlock.png b/Signature/Add_ESign/Data/DigitalSignatureBlock.png new file mode 100644 index 0000000000000000000000000000000000000000..9fda6b3ad6807b8e6b18aad979b91a72d61240eb GIT binary patch literal 2669 zcma);c`)0H7RQrF>@=vYs9&{|7TvX$5?jl)Zx4;FwNy!zT2f0%L|auQT#fxwRV}Tc zh_#k$i#2v)f5M|uQEMf(=l=0#-XHJH+&@0&%=e$~cjnBTIp>w7`CS3tQ@kJ$NWj?0 z!1}mTj`85;JgzM-qWF#*IMDj89*EQ@{ry-#AL^RvfIpCAw~#MnUB_NmKiwm@<|!2f*d>9bsI^I1>Q)tlc{qVfp!F>}-kdP7NEk*JU` zMc+1ThhfGYz#5c{A&BzE5I}zuY%hcrdV9vz)zv(#p>Z3wmh+3TzI_;0KcmC8<*sHf zZAUh#-CM5RT2J5iLLw>SzYZb=>3cucSdCrAkaX+m#B?xXoKZklBDi;s-^Jzg;J5bF zUoWgjvc7#wFI|PpK-s%d3Pa*2jWWCleR847yaAkULPII1OV$dfu5vF1Z#I73Fhm!r z2F{FI%35fjv3dw;nIP8UcXl6lozk~QrY^)=*^ODYmzCr#a|IrBHAL2nE%CGlRcrex z4_RWdKnn0`Wy7#2q2r+x{Au9jUAoU|a)rzL$pp08A!D;3QfAAu2ro+Bd)koWh|@al zu2X|XF*_Imd59N>5*p@R%b=uml61YCL=ZNu>B1zDk#c(z!3wTSIPaqax(sZg3K`6; z#;%L4pe{SGH#>L0?+(y4X6QdboQbRlaztVsqkGf9mD$sNNR?|-wOeJw&YV=+)Ut8| z)Tpjg*-#X{L>M?(n00~Ot#TgoG6sQ=l-bW@uSZ9i0%VToHCcjik=DLxh`c?VEdlM9 zpiufUI_*oQarFI{Eat{!r;Uj)Z z=bsNj`bk{+*bw)i(3bY5J-nb!wxrDqm-Vu$@4!=gXLM2SP`0guy)L1B9=Eq9I5hazS1eic@8~LCsC`NuQ2(kdWkA%E=)-w@7V3;Y)U^D1gL)SEt`q2#a_zG zs3Bvh{h(MBO88j@O22$x2T+kcl+c9D2TceoPaghw=J4wbMVT}~m{asZO73oaY*oAD znnT;3!lA_%iy<+Y22x-Yqa{@SEg-dhbfZs*(xe3x*fg8^atLHgUGke{FR@z!c%y@O zISVmqDOnx|`|u>}krdk|$}WeJE@xA?5gc`NJ3B~%8N{E4G--4%!v zBzT4l!`j+`an7J;COLC46OKlcau`RgfVBPOASsdem%5=wINNc6yi6;9J6)cs)*5hCHXaO+N^`LBzoznj#IEXZ|5J-E)j@RC(SW+UBkK1y9xwE376Z`yDtfa5<5>hHnGH3@y0xt&sXWuaHI_$Z#%bX_PDXnX# zz58$Y5yEzS>qb~J?0DJQZ$mxo3Gzn2pcK?UqN;?zAt>wfMGUR$ng#b`kfU#3C}n3B1Hv{c~Lzx~BZri7IDl zYEw_b_PWidLMo^l{;!8OZcpAJPrae35LUPlZ*YYTOtmh-+}j96i=6IJ9bhb_t<8Mc z@3Yfu{}Y*X*{k10#Hgh5cKAXlV*0DsWQ$YZ6nlUe1<={!lX#WPa3 zzpTP!w7UZ~t5%WEn5Bz-Kj22j@RUJTcf3fdvjg)MJBFWdGhBgj^9$z8rQ9O!G4x715New9jUP^U-smF^STW{NqpJ)rk{7VC(Yl4>t1#fWl6h~>nCLB(q(9z9Y z))u7|(BvIjr4-kpSkBP#uzmSFG|GC2HO&DlvKH#-G=%@e<;Ca^J*vstQsIc2Z`u#h oHA-AOF@$hE99$UjH~D!YJ}6^w&w0A`_(cR68=4!C^xUHV4c9#ml>h($ literal 0 HcmV?d00001 diff --git a/Signature/Add_ESign/Data/ESign.png b/Signature/Add_ESign/Data/ESign.png new file mode 100644 index 0000000000000000000000000000000000000000..1d4e294fcc20d1b1dad1c1d2e1c582165c6d478d GIT binary patch literal 5689 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 l>I<+*<$Kxy6AF9tm$bmjmFZQGN4 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 X7J}eil+1s9oc}u6xVSm~nQZ?Hy9$m< literal 0 HcmV?d00001 diff --git a/Signature/Add_ESign/Data/John.png b/Signature/Add_ESign/Data/John.png new file mode 100644 index 0000000000000000000000000000000000000000..b59e1ef23f7c7d9866f339584c84af8200ef3e6d GIT binary patch literal 2909 zcmai0c{tSF7oQp1%m_1-E!$W!ma>HGX3%S`#`;oW5ZNh-WSy8sV;SC1wuX>O8YAme zW0{bxtl6@KG?gXEp5M3U`ThHQe}CM2pYxo1Kj+-@oaK{(J8QuQ7l(sDAU-Qgb9>2&^iGqk(I-BP5h;2nSEg<*2UB`|zlPL|Ij_#N$ju=y)r{4_ zQ7k2_EWPWcC3IT=o`m2#3`L2f5vE!=nIu0d2HKBFM3f{#Q05$5rX=qFePNBm<8@5t zy9XxuxhY)5n3$eQ*BbfIsh3$NFQ07;|D3)Z?4^N5NYf)%++qCuIc>KEY-)UaOWhdP z7ad4%sF)bb+x(KH;h+21n}d(e*_7MfpP#4?T^uAO13DIfTZSt(rAK^yfCQD<?|wrTY5QPmX69u0V|O#Ot&ydVlQEtH!0c&wtlrIEL0jXu z1*GLK)CFCgZRPr}zV$u^^L@P5XK!nbsO=>Qc<4Fp<<@lVEp6)Q-)b-zOrsL{6_dC{ z0<54DgQi}N(Tqc<3?JK<-SJFw;eoSmr;2KrK5>2);9?N9N`(()F367Df~=uJr(b7Z z`!eu0Q_iCGgF7?s8D!(@hv!H86h;ytYZ`_65m`FH0x z$r?J5w5gcA=H1N|h4955P2js5J1w_(vJ4_aV7$C1A6V}l;+j*Wy|FGbY@B4qdpM0{ zvVG!78&u58`TmC%PvllT5}rBt=4lUqE+$27F1xKOvEJciPGEZHSSdo9@xNn++w7j5 z*H&^UPo3}1Jy+%aD!_REd4l@Y`Oe~(E(_hck1(p1&AgnhW%;KT?S|TH6B3XxmC+f0OgcOwz2D@|B z+Dsz943ycw@Uv4m7SEv)L*Rrt#+VJ3)Y4vJsxCIlsyJ6tvQ_@>dgAm{Rw7DZ;#k4v zx3QBqHrUyMkT^ERF62EGo2Bfe>{{cSwjKQ7$KH0h!ibjt0J=l1nm{_ke0jl{7}KLcq|heShI3844Pc5#610yv(~JebGUc zudX_bn`MqhAaAVAC9?#pnHDUeCOvExhtRAwOLUbT=4mW z0+V=m!DF@+b$YMcPaqg*3Zbvah%uqt^?)iwcYhUaUmxQ3Hc$JhwSzZ9e2|KfXvUo) z&A%@;TdXfRT!R6fFfM(x&qa^36xF?MqEArDJfiGK0TSZrwVfCKgYq^xs$G8z|3k&t zs$Ois0UMoz)8Q=BbsQ9QLG|FGy-Qblp|*>7<~D%m|)=@rKTR zNDz2J~LrmQTu1Hzw5N+7j;3vt>kRUd3G_V; zMcaE+czBiHP(`MuPg6~w*;c{Qk`$c92X*d974vrg{fJsV6XIv~uE@wK2Rf1a>-$9h zv`#`es)B=u|K2p5XQKLb>~3Ce3JiE-5V`DlbE7k=7WdeqV3s{mO7pO2x8`BaT=R$T>bkCH!>rn{WQJ{1206 zUJ*okL?)XeRP0l3V-g{25SBn+ku18;lX2KpJsJv*wGC(ebs3FNYZd}8Vrvvifxxln z(pAx-ty6?@r9Y!Z4U03nI&aw~u6ePDdrV)-IHrQ`xMfud=9*JD>DxnEHM(_REd!;l z&%bR`{4h*kM51y&chCYY zLc%0&GA8eip7V2e$=~AK*vl=9`WFGi*5X=zc=uy*@-tinDat#Lp0B}Ru6A|Iq|e~DWd@0cSmKqW@hjJY-yscnPjHJm z#BC+n;C)A$Vnz*iP&69!6vnNLPtajO87ceCfm&L#kCT@%x*;hMFww-B*Rf5m8)%lpc#cAhWzQdD$Az1g)c0oQ z-~O{${|XW-6-A)ABi8{$&}c96HXgT;0Oq*6`St=LviVrL|6-A?0IEMfL69VA2&U)} zo^j|Phl~&|594nxPd3s$+qkuz!+`<89(^6l5HBZ!j#>cy-zlCaWt+1U^DQYkS&0k{ z5UmKt%N(uqw4C))S&X7`2*?@ti_BRa=%$EqzQ91Q@ccXb`@i(?UoIg2(9k>)80uin Zr0C0dZ6Iat6F`YUR;SOJSDE4o{{aTXH4Oj& literal 0 HcmV?d00001 diff --git a/Signature/Add_ESign/Data/PDF.pfx b/Signature/Add_ESign/Data/PDF.pfx new file mode 100644 index 0000000000000000000000000000000000000000..940afae4f3885dd4d6f8a86e086886372a7fd736 GIT binary patch literal 2582 zcmZWpXH=8f7X3&<5QrcedRIh|Vxm;3(NLrr0R=&V0Sq0K(2)UyB=p__QG-&Vk=_-C zUPPLJAc#_xq99p!gaZFFVqb?4*;f!m_9a$*gmVAwf^o5dXhg^+f(Y3_h(WpjOS2y5 zfgCWKTu-*zw+jP-I0hj^$RN?KXj@A(7nX_>zjnwoy*kiZGeov!AV)f^w7;u^;}5lJ zXYiY}+)FKaKj85^Az_NRpFf9gtgYxtwV5bYrq;?R)_{+8GBQ;iR=MhTBODsScSqO{ zEh^kpK>TqTr%N?Izi^8KV7YmAC zdL39$!MNGwVb|}a7Yp8;c-t&K;l?F~4HsaBC25qF1gX=z-PR_LPgalQLDL?8#Pgr_ zYSPb5DLHqi(|um^tSuybh~5uU?}wMKa>2=;;@QMwjDinNL6m)DLVj(*gR+*NK|5iX}!t~;p9??N#_%HVp%&^$lPqb!=zA7R0?!))7d2no3#+ zp6-`AX(Sa>)Liil+3zVep>GU@yxu&cejZqqTyjH@^DDC%HY24lr?TMi)S#Wp`SoAm zZ1c!5Kt3+RXVA33K2dr&Q~zyGvUtetYWK@_UBkNshralA=WC7ZW}I4w57x z_vEzR+`}v!%vbMHsxO>@@w6l{9z=?lwp}GO%D24@-(WBMDw$`7qK7K^yVqsvNh^8C z$%>isGWyJ>s>IZ1(w7?K>U_lA*s@U5ea__iohQeigV~iKwDW20Z7w5V?V00T2nl-qGy**(sG?>6Kq2g!ctfweG zQ{RKtx0$uBY5DU(NNwPaa?LHVcC56L>}pGy;I2x-li(tM5oG1eass8tZaY4fy}?#% zIB8$^mQJFHvMn5tkWp$sVX-lS$xrS~l)dxhsMN8{=hkrE+e)?GGCb&Vzm8JU9rJx= zV&}+mBjvGsRTe2BT1k0A$jBQ3_C54`2s3WxKW)mn$62^Df?EITCG()Su_Uj0TJL$> z*IdV+g4V=WVNs!5?=e)LCPGeEx#1=wV#`ErX60o2n>9hzmJIyYw7Xk}kGaoCqhA%c zBy`dPi`!jxx42amICSHm`2de}G~b8#)IIUjFoO3G8uZy!6iR1svUKZ+TZe-tO;s); z0{*loU3%tLno;NMbEzV*mKHJ>vn$I@X^u>6mMiqUs+NEvEwb)-RrQ8b4z0v|Qz#d1WXp0vUAEYG?wnl? z^6optk$=`CCqEJjfv^DpfUt*h%0t;8Y(zCaHY7&E954gi04Kl~@Bs*{!UKMQ6ky3Z ze>2{I3#+@p!ok2T7U#q2eE}Q`yZ+^p0x*B+0$80ha1-!F-268aj2u?MLGgVK#>)AhGkS?A!QcA0ctFS`%8gfA!imwu#{*1cKr4_0yhyv zaOpom98ek&Ok+`05F5a{GX9;g{r}=mymwK4SSJhhd+|pQ!LH0Pu?h(@%NW_#5J1%OCgNbiP*PdMSEm}JqyMaO*>O`pdy==>XFZvD(9@vBu&BKCC3pJ7mC6c zmj%0C9|f4K<_wzk5aof{{60LwKa;k(c9^Y znT=zn`=WnzJfhAA6qxH8c&*b$da6*P_fp)^6{mY2cir`KNYfXgFc1$&nmYnWvY}f< z2Kzg0m=nmuZr`j{?q;U;zOZ63;3?f#(|#`^0~7)gDX5w|{b<~t?l0!oVl@fs_^`D& znmkn#o$A&!UxC-lyvKBxa;a&uISBGcr%A;NjZ^w~BOxr`-O z$$8SdY<)rtd_(Vb(zMe>Y1y+}TCD6Z?~jSJi=3ZZcI9`DDpK$B^o#dZ zoyjiIxEX literal 0 HcmV?d00001 diff --git a/Signature/Add_ESign/MainWindow.xaml b/Signature/Add_ESign/MainWindow.xaml new file mode 100644 index 0000000..61be2c7 --- /dev/null +++ b/Signature/Add_ESign/MainWindow.xaml @@ -0,0 +1,13 @@ + + + + + + diff --git a/Signature/Add_ESign/MainWindow.xaml.cs b/Signature/Add_ESign/MainWindow.xaml.cs new file mode 100644 index 0000000..e285e24 --- /dev/null +++ b/Signature/Add_ESign/MainWindow.xaml.cs @@ -0,0 +1,173 @@ +using Syncfusion.Pdf; +using Syncfusion.Pdf.Graphics; +using Syncfusion.Pdf.Security; +using Syncfusion.Windows.PdfViewer; +using System; +using System.Drawing; +using System.IO; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using Path = System.Windows.Shapes.Path; +using Bitmap = System.Drawing.Bitmap; + +namespace WPF_Sample_FW +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + bool addSignature = false; + public MainWindow() + { + InitializeComponent(); + PDFViewer.Load("../../../Data/Ink signature.pdf"); + PDFViewer.Loaded += PDFViewer_Loaded; + } + + private void PDFViewer_Loaded(object sender, RoutedEventArgs e) + { + // Find the default toolbar from the PDFViewer control template. + DocumentToolbar toolbar = PDFViewer.Template.FindName("PART_Toolbar", PDFViewer) as DocumentToolbar; + + // Find the stack panel inside the toolbar where buttons are arranged. + StackPanel stackPanel = (StackPanel)toolbar.Template.FindName("PART_ToolbarStack", toolbar); + + // Get the last stack panel in the toolbar stack (usually contains default buttons). + StackPanel stack = stackPanel.Children[stackPanel.Children.Count - 1] as StackPanel; + + // Get the first button from the stack to copy its style and icon. + Button button = stack.Children[0] as Button; + Path path1 = button.Content as Path; + + Button eSignButton = GetButton(path1, button); + + // Add the new eSign button to the toolbar stack. + stackPanel.Children.Add(eSignButton); + } + + private void eSignButton_Click(object sender, RoutedEventArgs e) + { + addSignature = true; + } + + private Button GetButton(System.Windows.Shapes.Path path1, Button button) + { + // Create a new custom button for eSign functionality. + Button eSignButton = new Button(); + + // Create a new Path object to use as the icon for the eSign button. + Path path = new Path(); + path.Data = System.Windows.Media.Geometry.Parse("M218.17 424.14c-2.95-5.92-8.09-6.52-10.17-6.52s-7.22.59-10.02 6.19l-7.67 15.34c-6.37 12.78-25.03 11.37-29.48-2.09L144 386.59l-10.61 31.88c-5.89 17.66-22.38 29.53-41 29.53H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h12.39c4.83 0 9.11-3.08 10.64-7.66l18.19-54.64c3.3-9.81 12.44-16.41 22.78-16.41s19.48 6.59 22.77 16.41l13.88 41.64c19.75-16.19 54.06-9.7 66 14.16 1.89 3.78 5.49 5.95 9.36 6.26v-82.12l128-127.09V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24v-40l-128-.11c-16.12-.31-30.58-9.28-37.83-23.75zM384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1zm-96 225.06V416h68.99l161.68-162.78-67.88-67.88L288 346.96zm280.54-179.63l-31.87-31.87c-9.94-9.94-26.07-9.94-36.01 0l-27.25 27.25 67.88 67.88 27.25-27.25c9.95-9.94 9.95-26.07 0-36.01z"); + + // Copy the fill color from the existing button's icon. + path.Fill = path1.Fill; + + // Set the icon as the content of the new button. + eSignButton.Content = path; + + // Match the icon's size and layout to the original button. + path.Stretch = Stretch.Uniform; + path.Height = path1.Height; + path.Width = path1.Width; + + // Match the button's background and layout properties to the original button. + eSignButton.Height = button.Height; + eSignButton.Width = button.Width; + eSignButton.Margin = button.Margin; + eSignButton.Style = button.Style; + // Attach the click event handler for eSign functionality. + eSignButton.Click += eSignButton_Click; + + return eSignButton; + } + + private void PDFViewer_PageClicked(object sender, PageClickedEventArgs args) + { + + int pageIndex = PDFViewer.CurrentPageIndex -1; + if (addSignature && pageIndex >= 0) + { + int width = 200; + int height = 100; + string signerName = "John"; + string dateTime = DateTime.Now.ToString("yyyy.MM.dd\nHH:mm:ss zzz"); + + string text = $"Digitally signed by {signerName}\nDate: {dateTime}\n\n"; + + string outputPath = "../../../Data/DigitalSignatureBlock.png"; + Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath)); + + using (Bitmap bitmap = new Bitmap(width, height)) + { + using (Graphics graphics = System.Drawing.Graphics.FromImage(bitmap)) + { + using (Font font = new Font("Arial", 9)) + using (SolidBrush backgroundBrush = new SolidBrush(System.Drawing.Color.White)) + { + graphics.FillRectangle(backgroundBrush, 0, 0, width, height); + + RectangleF layoutRect = new RectangleF(10, 10, width - 20, height - 20); + graphics.DrawString(text, font, System.Drawing.Brushes.Black, layoutRect); + + bitmap.Save(outputPath, System.Drawing.Imaging.ImageFormat.Png); + } + } + } + + // Load the two images + using (System.Drawing.Image image1 = System.Drawing.Image.FromFile("../../../Data/John.png")) + using (System.Drawing.Image image2 = System.Drawing.Image.FromFile("../../../Data/DigitalSignatureBlock.png")) + { + // Create a new bitmap with combined width and max height + int width1 = image1.Width + image2.Width; + int height1 = Math.Max(image1.Height, image2.Height); + + using (Bitmap combinedImage = new Bitmap(width1, height1)) + using (Graphics g = System.Drawing.Graphics.FromImage(combinedImage)) + { + // Draw both images side by side + g.DrawImage(image1, 0, 0); + g.DrawImage(image2, image1.Width, 0); + + // Save the result + combinedImage.Save("../../../Data/ESign.png", System.Drawing.Imaging.ImageFormat.Png); + } + } + + //Gets the first page of the document + PdfLoadedPage page = PDFViewer.LoadedDocument.Pages[pageIndex] as PdfLoadedPage; + //Create PDF graphics for the page. + PdfGraphics Graphics = page.Graphics; + //Retrieve the clicked client area position + System.Windows.Point clientPoint = args.Position; + PdfUnitConvertor convertor = new PdfUnitConvertor(); + float x = convertor.ConvertFromPixels((float)clientPoint.X, PdfGraphicsUnit.Point); + float y = convertor.ConvertFromPixels((float)clientPoint.Y, PdfGraphicsUnit.Point); + //Creates a certificate instance from PFX file with private key. + PdfCertificate pdfCert = new PdfCertificate("../../../Data/PDF.pfx", "password123"); + //Creates a digital signature + PdfSignature Signature = new PdfSignature(PDFViewer.LoadedDocument, page, pdfCert, "Signature"); + //Sets an image for signature field + PdfBitmap signatureImage = new PdfBitmap("../../../Data/ESign.png"); + //Sets Signature information + Signature.Bounds = new RectangleF(new PointF(x - ((signatureImage.Width / 2)/2), y - ((signatureImage.Height / 2)/2)), signatureImage.PhysicalDimension); + + Signature.ContactInfo = "johndoe@owned.us"; + Signature.LocationInfo = "Honolulu, Hawaii"; + Signature.Reason = "I am author of this document."; + //Draws the signature image + Signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0); + //Save the document into stream. + MemoryStream stream = new MemoryStream(); + PDFViewer.LoadedDocument.Save(stream); + stream.Position = 0; + //Reloads the document + PDFViewer.Load(stream); + PDFViewer.GoToPageAtIndex(pageIndex+1); + addSignature = false; + } + } + } +} diff --git a/Signature/Add_ESign/PDFViewer_WPF.csproj b/Signature/Add_ESign/PDFViewer_WPF.csproj new file mode 100644 index 0000000..2a6a268 --- /dev/null +++ b/Signature/Add_ESign/PDFViewer_WPF.csproj @@ -0,0 +1,12 @@ + + + + WinExe + + + + + + + + diff --git a/Signature/Add_ESign/PDFViewer_WPF.sln b/Signature/Add_ESign/PDFViewer_WPF.sln new file mode 100644 index 0000000..5f6dbcb --- /dev/null +++ b/Signature/Add_ESign/PDFViewer_WPF.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36401.2 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PDFViewer_WPF", "PDFViewer_WPF.csproj", "{0FAA7523-B034-4EA9-860A-A8936DFFD40E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0FAA7523-B034-4EA9-860A-A8936DFFD40E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FAA7523-B034-4EA9-860A-A8936DFFD40E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FAA7523-B034-4EA9-860A-A8936DFFD40E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FAA7523-B034-4EA9-860A-A8936DFFD40E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BAAD6341-6945-42C7-8438-919E9DB8EB03} + EndGlobalSection +EndGlobal diff --git a/Signature/Add_ESign/Properties/AssemblyInfo.cs b/Signature/Add_ESign/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6a2c04c --- /dev/null +++ b/Signature/Add_ESign/Properties/AssemblyInfo.cs @@ -0,0 +1,52 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +//[assembly: AssemblyTitle("PDFViewer_WPF")] +//[assembly: AssemblyDescription("")] +//[assembly: AssemblyConfiguration("")] +//[assembly: AssemblyCompany("")] +//[assembly: AssemblyProduct("PDFViewer_WPF")] +//[assembly: AssemblyCopyright("Copyright © 2025")] +//[assembly: AssemblyTrademark("")] +//[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +//[assembly: ThemeInfo( +// ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located +// //(used if a resource is not found in the page, +// // or application resource dictionaries) +// ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located +// //(used if a resource is not found in the page, +// // app, or any theme specific resource dictionaries) +//)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +//[assembly: AssemblyVersion("1.0.0.0")] +//[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Signature/Add_ESign/Properties/Resources.Designer.cs b/Signature/Add_ESign/Properties/Resources.Designer.cs new file mode 100644 index 0000000..75bb46f --- /dev/null +++ b/Signature/Add_ESign/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PDFViewer_WPF.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PDFViewer_WPF.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Signature/Add_ESign/Properties/Resources.resx b/Signature/Add_ESign/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Signature/Add_ESign/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Signature/Add_ESign/Properties/Settings.Designer.cs b/Signature/Add_ESign/Properties/Settings.Designer.cs new file mode 100644 index 0000000..67bc83e --- /dev/null +++ b/Signature/Add_ESign/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PDFViewer_WPF.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Signature/Add_ESign/Properties/Settings.settings b/Signature/Add_ESign/Properties/Settings.settings new file mode 100644 index 0000000..033d7a5 --- /dev/null +++ b/Signature/Add_ESign/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Signature/Add_ESign/packages.config b/Signature/Add_ESign/packages.config new file mode 100644 index 0000000..5b33600 --- /dev/null +++ b/Signature/Add_ESign/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Signature/Add_ESign/targets/MultiTargeting.targets b/Signature/Add_ESign/targets/MultiTargeting.targets new file mode 100644 index 0000000..4a85629 --- /dev/null +++ b/Signature/Add_ESign/targets/MultiTargeting.targets @@ -0,0 +1,10 @@ + + + net462;net8.0-windows;net9.0-windows + true + False + True + True + True + + \ No newline at end of file From adb221acae39748ccb49643ad00b5cc3556ed4b8 Mon Sep 17 00:00:00 2001 From: YathavakrishnanMohan <169874568+YathavakrishnanMohan@users.noreply.github.com> Date: Thu, 4 Sep 2025 19:34:55 +0530 Subject: [PATCH 2/5] Feed back changes --- Signature/Add_ESign/Data/ESign.png | Bin 5689 -> 5682 bytes Signature/Add_ESign/MainWindow.xaml.cs | 68 +++++++++++++++++-------- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/Signature/Add_ESign/Data/ESign.png b/Signature/Add_ESign/Data/ESign.png index 1d4e294fcc20d1b1dad1c1d2e1c582165c6d478d..e958355385b82867d3f34ba4d9595ae03892fbda 100644 GIT binary patch delta 5250 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 delta 5216 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 0) { int width = 200; int height = 100; string signerName = "John"; string dateTime = DateTime.Now.ToString("yyyy.MM.dd\nHH:mm:ss zzz"); - string text = $"Digitally signed by {signerName}\nDate: {dateTime}\n\n"; - - string outputPath = "../../../Data/DigitalSignatureBlock.png"; + string outputPath = "../../../../Data/DigitalSignatureBlock.png"; Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath)); - using (Bitmap bitmap = new Bitmap(width, height)) { using (Graphics graphics = System.Drawing.Graphics.FromImage(bitmap)) @@ -107,30 +105,29 @@ private void PDFViewer_PageClicked(object sender, PageClickedEventArgs args) using (SolidBrush backgroundBrush = new SolidBrush(System.Drawing.Color.White)) { graphics.FillRectangle(backgroundBrush, 0, 0, width, height); - RectangleF layoutRect = new RectangleF(10, 10, width - 20, height - 20); graphics.DrawString(text, font, System.Drawing.Brushes.Black, layoutRect); - bitmap.Save(outputPath, System.Drawing.Imaging.ImageFormat.Png); } } } - + string inputPath = "../../../Data/John.png"; // Replace with your image path + string outputPath1 = "../../../Data/Out.png"; // Desired output path + ResizeImage(inputPath, outputPath1, 200, 100); + Console.WriteLine("Image resized successfully."); // Load the two images - using (System.Drawing.Image image1 = System.Drawing.Image.FromFile("../../../Data/John.png")) + using (System.Drawing.Image image1 = System.Drawing.Image.FromFile("../../../Data/Out.png")) using (System.Drawing.Image image2 = System.Drawing.Image.FromFile("../../../Data/DigitalSignatureBlock.png")) { // Create a new bitmap with combined width and max height int width1 = image1.Width + image2.Width; int height1 = Math.Max(image1.Height, image2.Height); - using (Bitmap combinedImage = new Bitmap(width1, height1)) using (Graphics g = System.Drawing.Graphics.FromImage(combinedImage)) { // Draw both images side by side g.DrawImage(image1, 0, 0); g.DrawImage(image2, image1.Width, 0); - // Save the result combinedImage.Save("../../../Data/ESign.png", System.Drawing.Imaging.ImageFormat.Png); } @@ -138,36 +135,67 @@ private void PDFViewer_PageClicked(object sender, PageClickedEventArgs args) //Gets the first page of the document PdfLoadedPage page = PDFViewer.LoadedDocument.Pages[pageIndex] as PdfLoadedPage; - //Create PDF graphics for the page. - PdfGraphics Graphics = page.Graphics; + //Retrieve the clicked client area position System.Windows.Point clientPoint = args.Position; - PdfUnitConvertor convertor = new PdfUnitConvertor(); - float x = convertor.ConvertFromPixels((float)clientPoint.X, PdfGraphicsUnit.Point); - float y = convertor.ConvertFromPixels((float)clientPoint.Y, PdfGraphicsUnit.Point); + + // Convert client point to page point, which accounts for zoom mode. + System.Windows.Point pagePoint = PDFViewer.ConvertClientPointToPagePoint(clientPoint, pageIndex + 1); + double x = pagePoint.X; + double y = pagePoint.Y; + //Creates a certificate instance from PFX file with private key. PdfCertificate pdfCert = new PdfCertificate("../../../Data/PDF.pfx", "password123"); + //Creates a digital signature PdfSignature Signature = new PdfSignature(PDFViewer.LoadedDocument, page, pdfCert, "Signature"); + //Sets an image for signature field PdfBitmap signatureImage = new PdfBitmap("../../../Data/ESign.png"); - //Sets Signature information - Signature.Bounds = new RectangleF(new PointF(x - ((signatureImage.Width / 2)/2), y - ((signatureImage.Height / 2)/2)), signatureImage.PhysicalDimension); + + // Center the signature on the click position using dimensions in points. + float sigWidth = signatureImage.PhysicalDimension.Width; + float sigHeight = signatureImage.PhysicalDimension.Height; + Signature.Bounds = new System.Drawing.RectangleF((float)(x), (float)(y), sigWidth * 2, sigHeight * 2); Signature.ContactInfo = "johndoe@owned.us"; Signature.LocationInfo = "Honolulu, Hawaii"; Signature.Reason = "I am author of this document."; + //Draws the signature image Signature.Appearance.Normal.Graphics.DrawImage(signatureImage, 0, 0); + //Save the document into stream. MemoryStream stream = new MemoryStream(); PDFViewer.LoadedDocument.Save(stream); stream.Position = 0; + //Reloads the document PDFViewer.Load(stream); - PDFViewer.GoToPageAtIndex(pageIndex+1); + PDFViewer.GoToPageAtIndex(pageIndex + 1); addSignature = false; } + + } + private void ResizeImage(string inputPath, string outputPath, int width, int height) + { + + using (System.Drawing.Image originalImage = System.Drawing.Image.FromFile(inputPath)) + { + using (Bitmap resizedImage = new Bitmap(width, height)) + { + using (Graphics graphics = Graphics.FromImage(resizedImage)) + { + graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; + graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; + graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + + graphics.DrawImage(originalImage, 0, 0, width, height); + } + + resizedImage.Save(outputPath); + } + } } } } From f9fbb9b0098f987eee14d953c5c1e513f2a6e379 Mon Sep 17 00:00:00 2001 From: YathavakrishnanMohan <169874568+YathavakrishnanMohan@users.noreply.github.com> Date: Mon, 8 Sep 2025 13:24:18 +0530 Subject: [PATCH 3/5] Feedback changes --- .../Add_ESign/Data/DigitalSignatureBlock.png | Bin 2669 -> 0 bytes Signature/Add_ESign/Data/ESign.png | Bin 5682 -> 0 bytes Signature/Add_ESign/Data/John.png | Bin 2909 -> 2913 bytes Signature/Add_ESign/MainWindow.xaml.cs | 125 ++++++++---------- 4 files changed, 55 insertions(+), 70 deletions(-) delete mode 100644 Signature/Add_ESign/Data/DigitalSignatureBlock.png delete mode 100644 Signature/Add_ESign/Data/ESign.png diff --git a/Signature/Add_ESign/Data/DigitalSignatureBlock.png b/Signature/Add_ESign/Data/DigitalSignatureBlock.png deleted file mode 100644 index 9fda6b3ad6807b8e6b18aad979b91a72d61240eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2669 zcma);c`)0H7RQrF>@=vYs9&{|7TvX$5?jl)Zx4;FwNy!zT2f0%L|auQT#fxwRV}Tc zh_#k$i#2v)f5M|uQEMf(=l=0#-XHJH+&@0&%=e$~cjnBTIp>w7`CS3tQ@kJ$NWj?0 z!1}mTj`85;JgzM-qWF#*IMDj89*EQ@{ry-#AL^RvfIpCAw~#MnUB_NmKiwm@<|!2f*d>9bsI^I1>Q)tlc{qVfp!F>}-kdP7NEk*JU` zMc+1ThhfGYz#5c{A&BzE5I}zuY%hcrdV9vz)zv(#p>Z3wmh+3TzI_;0KcmC8<*sHf zZAUh#-CM5RT2J5iLLw>SzYZb=>3cucSdCrAkaX+m#B?xXoKZklBDi;s-^Jzg;J5bF zUoWgjvc7#wFI|PpK-s%d3Pa*2jWWCleR847yaAkULPII1OV$dfu5vF1Z#I73Fhm!r z2F{FI%35fjv3dw;nIP8UcXl6lozk~QrY^)=*^ODYmzCr#a|IrBHAL2nE%CGlRcrex z4_RWdKnn0`Wy7#2q2r+x{Au9jUAoU|a)rzL$pp08A!D;3QfAAu2ro+Bd)koWh|@al zu2X|XF*_Imd59N>5*p@R%b=uml61YCL=ZNu>B1zDk#c(z!3wTSIPaqax(sZg3K`6; z#;%L4pe{SGH#>L0?+(y4X6QdboQbRlaztVsqkGf9mD$sNNR?|-wOeJw&YV=+)Ut8| z)Tpjg*-#X{L>M?(n00~Ot#TgoG6sQ=l-bW@uSZ9i0%VToHCcjik=DLxh`c?VEdlM9 zpiufUI_*oQarFI{Eat{!r;Uj)Z z=bsNj`bk{+*bw)i(3bY5J-nb!wxrDqm-Vu$@4!=gXLM2SP`0guy)L1B9=Eq9I5hazS1eic@8~LCsC`NuQ2(kdWkA%E=)-w@7V3;Y)U^D1gL)SEt`q2#a_zG zs3Bvh{h(MBO88j@O22$x2T+kcl+c9D2TceoPaghw=J4wbMVT}~m{asZO73oaY*oAD znnT;3!lA_%iy<+Y22x-Yqa{@SEg-dhbfZs*(xe3x*fg8^atLHgUGke{FR@z!c%y@O zISVmqDOnx|`|u>}krdk|$}WeJE@xA?5gc`NJ3B~%8N{E4G--4%!v zBzT4l!`j+`an7J;COLC46OKlcau`RgfVBPOASsdem%5=wINNc6yi6;9J6)cs)*5hCHXaO+N^`LBzoznj#IEXZ|5J-E)j@RC(SW+UBkK1y9xwE376Z`yDtfa5<5>hHnGH3@y0xt&sXWuaHI_$Z#%bX_PDXnX# zz58$Y5yEzS>qb~J?0DJQZ$mxo3Gzn2pcK?UqN;?zAt>wfMGUR$ng#b`kfU#3C}n3B1Hv{c~Lzx~BZri7IDl zYEw_b_PWidLMo^l{;!8OZcpAJPrae35LUPlZ*YYTOtmh-+}j96i=6IJ9bhb_t<8Mc z@3Yfu{}Y*X*{k10#Hgh5cKAXlV*0DsWQ$YZ6nlUe1<={!lX#WPa3 zzpTP!w7UZ~t5%WEn5Bz-Kj22j@RUJTcf3fdvjg)MJBFWdGhBgj^9$z8rQ9O!G4x715New9jUP^U-smF^STW{NqpJ)rk{7VC(Yl4>t1#fWl6h~>nCLB(q(9z9Y z))u7|(BvIjr4-kpSkBP#uzmSFG|GC2HO&DlvKH#-G=%@e<;Ca^J*vstQsIc2Z`u#h oHA-AOF@$hE99$UjH~D!YJ}6^w&w0A`_(cR68=4!C^xUHV4c9#ml>h($ diff --git a/Signature/Add_ESign/Data/ESign.png b/Signature/Add_ESign/Data/ESign.png deleted file mode 100644 index e958355385b82867d3f34ba4d9595ae03892fbda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5682 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 LNkvXXu0mjff1m*X delta 2707 zcmV;E3T*Y^7Tp$*RvPk2L_t(|UhSO)j1ylM#Wx{ALU0y>ySuwvk#QP6d+(R?{$H2Q zZ2Q`>Y&*L>zhtu8*V%@UIWzCxd+u$J&1UOvv)NYg;K3u}5oEL3whAG{DM2E#%DhMj z`45rp8j-n^1CXHL0u=Z^VpVlgNXAF_AvUI`8k zmcxe+OS5Lpq+Ppq=2M8ppg?>`hYlU2bLYw)Rg97m(Z{NO^bm`K`kt0XK*IvJVtpfGy*RLDSCDwof@iCn` zb&@u1+8EZ#mMtrb7cVxf5oP+4e^rPzpg{b<`}gl9bLPx4d-iPg`oV(- zk~?>92@4A|pGy1;1>z^L#Y&z$x!k{hUsc(W>Sce3^`Jn!;>3xgGFx~$5o-}p0>K@6$BrE`b?Q{<-@m`quU}sZ6eytf|G0xUY0^Z7 z4<9buwrx{F`1R|T`6Hr)I(6zuP*9Mnf2tE}5n}{`CjsujxUi8G!p~j1cFCwwqohTP z7E-KOF}2S})w*fZrYg-kdh}@3i-GNwKY`68e*E|<-Ak;6Mfz3~k%Cm5CE4D*w~VmoLLVcj?llQnYAMB_@9ZD|~_ke+g84 zL(`(Qu)IL7T)84ER;-YfD_6>@RjVQ#cn{kqocHY6GkNvul@bDe>OfI$(4aw*Dpe|3 zvu2I?ZJ+Y|`Ew=KG-=W($1kxCmKR7=vv%!TNu4^iUkAB8efm@-1YkKyn>MX_9i5mn zXHJYAJ`wN&0SJ=)X%>VakSIWpe|pQ7Eu~|}j^gLI8q=Ua9KcXFh~&_rL*}=l6th48e=a_xr~L)8 zen=QNc0W3TDUlT_RFLJ%m#cL8v}w~MOO`CkR~D0?Kuj!LxKL80NFk3OKQ_M=WjGTE zwp&S)CXFyA$dT{gzejrL9I}Jmx^+{|;;&!7hOgt|N17Z-1Bk#8o6V-u>W)()0qRSY zD_1tGMRzC=Ct#>F0(W2Ge@q~tM~@yV4Q)0@o;hmgLHf=J$ z6(zV52=3GeTe`9`n zID)55zDPV_yEJpr+t%XhYAQJyn(nf7_S#?c1B*Hh^;>r~?NM znBNKq+p)fV`d-ce8wNR-?oZ;%*q_AH{#!3h33&>bONZq@4H@_VL z#0iL9Tx}6iXPG&3rg@o|pg=sJc=6(YeK8@sgw!YcQIHuzA9?fD?rc5!ck%&+r9)QdZE^cqRefzeuup?uHI07kI z2m}{7j@YqdORQM2RIR~N5X`&VVmX4^1X_lXmFm)^i^_Nbq>laNJ&R6IARd5JXvT~g zBiw~`pa}}qW=wO(of<T!D++u`c2%NYNtug&`5J ziBzv%U9}z)JrszCG;iKqx_0eqUN(T#Db7KVjP5`@C6FqHl^%^%-mjgB5YYBy3cC@wX+_%I(1e`!%7cW(+ zl!_Z*`Nq@3TQK0j9H;{{Ho=ktXD+(&(7Fo?JBBOR54?sbu$4n!2l_xTTlmXReuMG`2?gu?1Y7dDT@ed7^rPvARD$}Na12D=6Ik34h8z2y5v)Q(q7YQN%@jssF+O=zt;^P1S N002ovPDHLkV1l`13zPr= diff --git a/Signature/Add_ESign/MainWindow.xaml.cs b/Signature/Add_ESign/MainWindow.xaml.cs index 7e0fd8b..cd99cb6 100644 --- a/Signature/Add_ESign/MainWindow.xaml.cs +++ b/Signature/Add_ESign/MainWindow.xaml.cs @@ -18,11 +18,12 @@ namespace WPF_Sample_FW /// public partial class MainWindow : Window { + string filePath = "../../../Data/"; bool addSignature = false; public MainWindow() { InitializeComponent(); - PDFViewer.Load("../../../Data/Ink signature.pdf"); + PDFViewer.Load(filePath + "Ink signature.pdf"); PDFViewer.Loaded += PDFViewer_Loaded; PDFViewer.ZoomMode = ZoomMode.FitPage; } @@ -40,9 +41,9 @@ private void PDFViewer_Loaded(object sender, RoutedEventArgs e) // Get the first button from the stack to copy its style and icon. Button button = stack.Children[0] as Button; - Path path1 = button.Content as Path; + Path oldStylePath = button.Content as Path; - Button eSignButton = GetButton(path1, button); + Button eSignButton = GetButton(oldStylePath, button); // Add the new eSign button to the toolbar stack. stackPanel.Children.Add(eSignButton); @@ -50,10 +51,10 @@ private void PDFViewer_Loaded(object sender, RoutedEventArgs e) private void eSignButton_Click(object sender, RoutedEventArgs e) { - addSignature = true; + addSignature = true; } - private Button GetButton(System.Windows.Shapes.Path path1, Button button) + private Button GetButton(System.Windows.Shapes.Path oldPath, Button button) { // Create a new custom button for eSign functionality. Button eSignButton = new Button(); @@ -63,15 +64,15 @@ private Button GetButton(System.Windows.Shapes.Path path1, Button button) path.Data = System.Windows.Media.Geometry.Parse("M218.17 424.14c-2.95-5.92-8.09-6.52-10.17-6.52s-7.22.59-10.02 6.19l-7.67 15.34c-6.37 12.78-25.03 11.37-29.48-2.09L144 386.59l-10.61 31.88c-5.89 17.66-22.38 29.53-41 29.53H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h12.39c4.83 0 9.11-3.08 10.64-7.66l18.19-54.64c3.3-9.81 12.44-16.41 22.78-16.41s19.48 6.59 22.77 16.41l13.88 41.64c19.75-16.19 54.06-9.7 66 14.16 1.89 3.78 5.49 5.95 9.36 6.26v-82.12l128-127.09V160H248c-13.2 0-24-10.8-24-24V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24v-40l-128-.11c-16.12-.31-30.58-9.28-37.83-23.75zM384 121.9c0-6.3-2.5-12.4-7-16.9L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1zm-96 225.06V416h68.99l161.68-162.78-67.88-67.88L288 346.96zm280.54-179.63l-31.87-31.87c-9.94-9.94-26.07-9.94-36.01 0l-27.25 27.25 67.88 67.88 27.25-27.25c9.95-9.94 9.95-26.07 0-36.01z"); // Copy the fill color from the existing button's icon. - path.Fill = path1.Fill; + path.Fill = oldPath.Fill; // Set the icon as the content of the new button. eSignButton.Content = path; // Match the icon's size and layout to the original button. path.Stretch = Stretch.Uniform; - path.Height = path1.Height; - path.Width = path1.Width; + path.Height = oldPath.Height; + path.Width = oldPath.Width; // Match the button's background and layout properties to the original button. eSignButton.Height = button.Height; @@ -86,52 +87,10 @@ private Button GetButton(System.Windows.Shapes.Path path1, Button button) private void PDFViewer_PageClicked(object sender, PageClickedEventArgs args) { - - int pageIndex = PDFViewer.CurrentPageIndex - 1; - if (addSignature && pageIndex >= 0) + if (addSignature) { - int width = 200; - int height = 100; - string signerName = "John"; - string dateTime = DateTime.Now.ToString("yyyy.MM.dd\nHH:mm:ss zzz"); - string text = $"Digitally signed by {signerName}\nDate: {dateTime}\n\n"; - string outputPath = "../../../../Data/DigitalSignatureBlock.png"; - Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath)); - using (Bitmap bitmap = new Bitmap(width, height)) - { - using (Graphics graphics = System.Drawing.Graphics.FromImage(bitmap)) - { - using (Font font = new Font("Arial", 9)) - using (SolidBrush backgroundBrush = new SolidBrush(System.Drawing.Color.White)) - { - graphics.FillRectangle(backgroundBrush, 0, 0, width, height); - RectangleF layoutRect = new RectangleF(10, 10, width - 20, height - 20); - graphics.DrawString(text, font, System.Drawing.Brushes.Black, layoutRect); - bitmap.Save(outputPath, System.Drawing.Imaging.ImageFormat.Png); - } - } - } - string inputPath = "../../../Data/John.png"; // Replace with your image path - string outputPath1 = "../../../Data/Out.png"; // Desired output path - ResizeImage(inputPath, outputPath1, 200, 100); - Console.WriteLine("Image resized successfully."); - // Load the two images - using (System.Drawing.Image image1 = System.Drawing.Image.FromFile("../../../Data/Out.png")) - using (System.Drawing.Image image2 = System.Drawing.Image.FromFile("../../../Data/DigitalSignatureBlock.png")) - { - // Create a new bitmap with combined width and max height - int width1 = image1.Width + image2.Width; - int height1 = Math.Max(image1.Height, image2.Height); - using (Bitmap combinedImage = new Bitmap(width1, height1)) - using (Graphics g = System.Drawing.Graphics.FromImage(combinedImage)) - { - // Draw both images side by side - g.DrawImage(image1, 0, 0); - g.DrawImage(image2, image1.Width, 0); - // Save the result - combinedImage.Save("../../../Data/ESign.png", System.Drawing.Imaging.ImageFormat.Png); - } - } + int pageIndex = PDFViewer.CurrentPageIndex - 1; + CreateSignatureImage(); //Gets the first page of the document PdfLoadedPage page = PDFViewer.LoadedDocument.Pages[pageIndex] as PdfLoadedPage; @@ -145,18 +104,18 @@ private void PDFViewer_PageClicked(object sender, PageClickedEventArgs args) double y = pagePoint.Y; //Creates a certificate instance from PFX file with private key. - PdfCertificate pdfCert = new PdfCertificate("../../../Data/PDF.pfx", "password123"); + PdfCertificate pdfCert = new PdfCertificate( filePath + "PDF.pfx", "password123"); //Creates a digital signature PdfSignature Signature = new PdfSignature(PDFViewer.LoadedDocument, page, pdfCert, "Signature"); //Sets an image for signature field - PdfBitmap signatureImage = new PdfBitmap("../../../Data/ESign.png"); + PdfBitmap signatureImage = new PdfBitmap( filePath + "ESign.png"); // Center the signature on the click position using dimensions in points. - float sigWidth = signatureImage.PhysicalDimension.Width; - float sigHeight = signatureImage.PhysicalDimension.Height; - Signature.Bounds = new System.Drawing.RectangleF((float)(x), (float)(y), sigWidth * 2, sigHeight * 2); + float signWidth = signatureImage.PhysicalDimension.Width; + float signHeight = signatureImage.PhysicalDimension.Height; + Signature.Bounds = new System.Drawing.RectangleF((float)(x), (float)(y), signWidth, signHeight); Signature.ContactInfo = "johndoe@owned.us"; Signature.LocationInfo = "Honolulu, Hawaii"; @@ -172,28 +131,54 @@ private void PDFViewer_PageClicked(object sender, PageClickedEventArgs args) //Reloads the document PDFViewer.Load(stream); - PDFViewer.GoToPageAtIndex(pageIndex + 1); addSignature = false; } } - private void ResizeImage(string inputPath, string outputPath, int width, int height) - { - using (System.Drawing.Image originalImage = System.Drawing.Image.FromFile(inputPath)) + private void CreateSignatureImage() + { + int pageIndex = PDFViewer.CurrentPageIndex - 1; + if(pageIndex < 0) + return; + int width = 200; + int height = 100; + string signerName = "John"; + string dateTime = DateTime.Now.ToString("yyyy.MM.dd\nHH:mm:ss zzz"); + string text = $"Digitally signed by {signerName}\nDate: {dateTime}\n\n"; + string outputPath = filePath + "DigitalSignatureBlock.png"; + Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath)); + using (Bitmap bitmap = new Bitmap(width, height)) { - using (Bitmap resizedImage = new Bitmap(width, height)) + using (Graphics graphics = System.Drawing.Graphics.FromImage(bitmap)) { - using (Graphics graphics = Graphics.FromImage(resizedImage)) + using (Font font = new Font("Arial", 9)) + using (SolidBrush backgroundBrush = new SolidBrush(System.Drawing.Color.White)) { - graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; - graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; - graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; - - graphics.DrawImage(originalImage, 0, 0, width, height); + graphics.FillRectangle(backgroundBrush, 0, 0, width, height); + RectangleF layoutRect = new RectangleF(10, 10, width - 20, height - 20); + graphics.DrawString(text, font, System.Drawing.Brushes.Black, layoutRect); + bitmap.Save(outputPath, System.Drawing.Imaging.ImageFormat.Png); } + } + } + string inputPath = filePath + "John.png"; - resizedImage.Save(outputPath); + // Load the two images + using (System.Drawing.Image nameImage = System.Drawing.Image.FromFile( filePath + "John.png")) + using (System.Drawing.Image signImage = System.Drawing.Image.FromFile(filePath + "DigitalSignatureBlock.png")) + { + // Create a new bitmap with combined width and max height + int signatureWidth = nameImage.Width + signImage.Width; + int signatureHeight = Math.Max(nameImage.Height, signImage.Height); + using (Bitmap combinedImage = new Bitmap(signatureWidth, signatureHeight)) + using (Graphics g = System.Drawing.Graphics.FromImage(combinedImage)) + { + // Draw both images side by side + g.DrawImage(nameImage, 0, 0); + g.DrawImage(signImage, nameImage.Width, 0); + // Save the result + combinedImage.Save( filePath + "ESign.png", System.Drawing.Imaging.ImageFormat.Png); } } } From ba5ff5bf1e5d0b464b45fb05a72f98e15636e397 Mon Sep 17 00:00:00 2001 From: YathavakrishnanMohan <169874568+YathavakrishnanMohan@users.noreply.github.com> Date: Mon, 8 Sep 2025 13:55:32 +0530 Subject: [PATCH 4/5] Feedback changes --- Signature/Add_ESign/MainWindow.xaml.cs | 51 ++++++++++++++++---------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/Signature/Add_ESign/MainWindow.xaml.cs b/Signature/Add_ESign/MainWindow.xaml.cs index cd99cb6..f11ab5a 100644 --- a/Signature/Add_ESign/MainWindow.xaml.cs +++ b/Signature/Add_ESign/MainWindow.xaml.cs @@ -141,6 +141,38 @@ private void CreateSignatureImage() int pageIndex = PDFViewer.CurrentPageIndex - 1; if(pageIndex < 0) return; + + //Creating image for current date and time details + CreateCurrentDataImage(); + + //Combine the name image and date-time image into a single image + CombineSignatureAntDataImage(); + + } + + private void CombineSignatureAntDataImage() + { + // Load the two images + using (System.Drawing.Image nameImage = System.Drawing.Image.FromFile(filePath + "John.png")) + using (System.Drawing.Image signImage = System.Drawing.Image.FromFile(filePath + "DigitalSignatureBlock.png")) + { + // Create a new bitmap with combined width and max height + int signatureWidth = nameImage.Width + signImage.Width; + int signatureHeight = Math.Max(nameImage.Height, signImage.Height); + using (Bitmap combinedImage = new Bitmap(signatureWidth, signatureHeight)) + using (Graphics g = System.Drawing.Graphics.FromImage(combinedImage)) + { + // Draw both images side by side + g.DrawImage(nameImage, 0, 0); + g.DrawImage(signImage, nameImage.Width, 0); + // Save the result + combinedImage.Save(filePath + "ESign.png", System.Drawing.Imaging.ImageFormat.Png); + } + } + } + + private void CreateCurrentDataImage() + { int width = 200; int height = 100; string signerName = "John"; @@ -162,25 +194,6 @@ private void CreateSignatureImage() } } } - string inputPath = filePath + "John.png"; - - // Load the two images - using (System.Drawing.Image nameImage = System.Drawing.Image.FromFile( filePath + "John.png")) - using (System.Drawing.Image signImage = System.Drawing.Image.FromFile(filePath + "DigitalSignatureBlock.png")) - { - // Create a new bitmap with combined width and max height - int signatureWidth = nameImage.Width + signImage.Width; - int signatureHeight = Math.Max(nameImage.Height, signImage.Height); - using (Bitmap combinedImage = new Bitmap(signatureWidth, signatureHeight)) - using (Graphics g = System.Drawing.Graphics.FromImage(combinedImage)) - { - // Draw both images side by side - g.DrawImage(nameImage, 0, 0); - g.DrawImage(signImage, nameImage.Width, 0); - // Save the result - combinedImage.Save( filePath + "ESign.png", System.Drawing.Imaging.ImageFormat.Png); - } - } } } } From f71aa0441d7fa771682bb9cb80256c3574b0a3ef Mon Sep 17 00:00:00 2001 From: YathavakrishnanMohan <169874568+YathavakrishnanMohan@users.noreply.github.com> Date: Mon, 8 Sep 2025 13:57:47 +0530 Subject: [PATCH 5/5] Feedback changes --- Signature/Add_ESign/MainWindow.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Signature/Add_ESign/MainWindow.xaml.cs b/Signature/Add_ESign/MainWindow.xaml.cs index f11ab5a..cbe38bf 100644 --- a/Signature/Add_ESign/MainWindow.xaml.cs +++ b/Signature/Add_ESign/MainWindow.xaml.cs @@ -146,11 +146,11 @@ private void CreateSignatureImage() CreateCurrentDataImage(); //Combine the name image and date-time image into a single image - CombineSignatureAntDataImage(); + CombineSignatureAndDataImage(); } - private void CombineSignatureAntDataImage() + private void CombineSignatureAndDataImage() { // Load the two images using (System.Drawing.Image nameImage = System.Drawing.Image.FromFile(filePath + "John.png"))