設定次第だが、DocuSignは署名が完了するなどのタイミングでHTTPSで通知を飛ばしてくれる。
そしてこちらも設定次第だが、その通知の中には署名対象のPDFファイルがバイト配列で含まれている。
今回はそのバイト配列をPDFファイルへデコードするときのお話。
HTTPSに入っている情報
DocuSignは設定しておけば、「エンベロープを送信」や「エンベロープ開封」、「署名が完了」といったタイミングでHTTPSで通知を飛ばしてくれる。
そして届いたHTTPSのbodyの中には↓のようなXML形式が入っていて様々な情報が入っている。
<?xml version="1.0" encoding="utf-8"?> <DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docusign.net/API/3.0"> <EnvelopeStatus> ・・・ <RecipientStatuses> <RecipientStatus> ・・・ </RecipientStatus> </RecipientStatuses> </EnvelopeStatus> <DocumentPDFs> <DocumentPDF> <Name>hogehoge.pdf</Name> <PDFBytes> PDFのバイト配列 </PDFBytes> </DocumentPDF> </DocumentPDFs> </DocuSignEnvelopeInformation>
「・・・」の部分に、作成日や作成者、署名日といった情報がたくさん入っているのだが、今回は省略。
この情報を見ることで、プログラム上で誰が署名していない、とかをチェックすることができるわけだ。
PDFBytes
さらにこちらも設定次第だが、DocuSignは通知の中にPDFファイルを入れて飛ばしてくれる。
「署名完了」の通知でPDFファイルを送信してもらえば署名がそろった文書が手に入るし、「受信者Aさんの署名が完了」みたいなタイミングで送ってもらえば署名に不備がないかを目視で確認することもできる。
そんなPDFファイルはHTTPSの通信で送られてくるので、下のような感じでPDFBytesタグの中にバイト配列が文字列でそのまんま載っている。
<DocumentPDFs> <DocumentPDF> <Name>hogehoge.pdf</Name> <PDFBytes> PDFのバイト配列をBase64でエンコードした文字列 </PDFBytes> </DocumentPDF> </DocumentPDFs>
今回そのPDFBytesをデコードしようとしたのだが、どういった変換方法でデコードすればよいのかわからなかった。
C#でのデコード
ということで色々試した結果、C#ではこんな感じでデコードすればPDFファイルへ変換することができた。
byte[] buffer = Convert.FromBase64String("PDFBytesタグ内の文字列"); File.WriteAllBytes("保存するPDFファイル名", buffer);
UTF-8やらASCIIやらUnicodeやらいろいろなBase64変換形式を試したけれど、特に指定しないで8ビット符号なしでいけた!
まとめ
ということでDocuSignから通知が送られてきたら、
- PDFBytesタグを探す(複数のときもある)
- PDFBytes内の文字列をConvert.FromBase64Stringを使ってデコードする
という感じでPDFファイルを保存することができる。
そのままファイルへ書き出してローカルに保存してもいいし、SharePointOnlineみたいなところへ保存するようにして管理できれば中々便利。
コメント