1,753 views(since 2013/10/08)

Office365, silverlight(C#) Async(非同期), PDF作成, PDF表示の方法について(Sharepoint sandbox サンドボックス)

Office365, silverlight(C#) Async(非同期), PDF作成, PDF表示の方法について(Sharepoint sandbox サンドボックス) 処理概要(Office365(Sharepoint online) Sandbox Silverlight Application)

  1. Office365のDocument Library(ドキュメントライブラリ) から xlsx (Excel Template)を取得する
  2. xlsx と設定したいデータを Web Service に送り、Web Serviceにてxlsxにデータをセットして PDFを受信する [PDF保存&開く]ボタンをクリックする。
  3. 受信したPDFを別のブラウザに表示させる [PDF保存&開く]ボタンをクリックされたら 新規WIndowsを作成して、Loading画面を表示する
  4. Silverlightの非同期処理でPDFがOffice365のドキュメントライブラリに保存されたらPDFを表示させる。

解説(Excel から PDF作成するサービスは別の投稿にて説明します。)

  1. IEのポップアップブロックの回避(popup block) ポップアップはJavaScript でwindow.open() 処理を行うとおこります。例外が一つあります。ユーザがHTML Buttonの onClick 処理をしたときにはIEはポップアップブロックをしません。 今回はそこを利用します。Silverlightの場合はSilverlihgtのボタンが該当します。 注意)Silverlight で Sleep後、非同期処理(Async)ではポップアップブロックどころかHtmlPage.PopupWindowは動作しません(HtmlPage.Alertは動作する)
  2. silverlightの非同期処理(Async)からのPDF表示(非同期処理では IE で新規window作成できない) 非同期処理(Async)からは別ウィンドウをJavaScript経由で操作してOffice365からPDFをダウンロードして表示します。
  3. Office365のdocument libraryが(ドキュメントタイプ)doc typeをかえさないようなので?(パケット未確認)、PDFと認識せずバイナリとしてダウンロードされるのでブラウザーないでPDFが開かないのでPDFObjetというJavaScriptを使います。
  4. Office365(Sharepoint online)の設定をかえて ブラウザ内で直接PDFを開けるようにする方法もあるようです。 http://techblurt.com/2012/03/02/office365-open-pdf-in-the-browser/ PowerShell でこんなコマンドを入れみたい(未テスト)$webApp.AllowedInlineDownloadedMimeTypes.Add(“application/pdf”)

プログラム default.aspx にIEのWindowsの作成JavaScriptを追加する。

<%@ Page language="C#" MasterPageFile="~masterurl/default.master" Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage,Microsoft.SharePoint,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c"  %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ID="phPageTitle" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
    <SharePoint:ProjectProperty ID="ppTitle" Property="Title" runat="server"/>
</asp:Content>

<asp:Content ID="phMain" ContentPlaceHolderId="PlaceHolderMain" runat="server">

    <STYLE type='text/css'>
        #s4-leftpanel
        {
            display : none;
        }
        .s4-ca
        {
            margin-left : 0px !important;
        }

        #s4-searcharea
        {
            display : none;
        }
    </STYLE>

    <WebPartPages:SilverlightWebPart
        runat="server"
        Height="600px"
        Url="~sitecollection/SiteAssets/EAP_Office365/SilverlightWebPartMain/SilverlightProjectMain.xap?version=0_0_1"
        ImportErrorMessage="$Resources:core,ImportErrorMessage;"
        ApplicationXml=""
        WindowlessMode="False"
        Description="EAP_Office365"
        ID="g_7e129824_46fc_4902_9bbf_b28bf5573d20"
        Width="955px"
        Title="EAP_Office365 - SilverlightWebPartMain"
        __MarkupType="vsattributemarkup"
        __WebPartId="{37DA73F0-C708-4DAC-A1D5-90A7B500EB9B}"
        WebPart="true"

        __designer:IsClosed="false">
    </WebPartPages:SilverlightWebPart>

    <script type="text/javascript">
        function ChildWindow_Open(strWindowName, strURL) {
            window.open(strURL, strWindowName);
        }
        function ChildWindow_SetLocation(strWindowName, strURL) {
            var ChildWindow = window.open(strURL, strWindowName);
            ChildWindow.location = strURL;
        }
    </script>

</asp:Content>

PDF作成中に表示するHTML

<%@ Page language="C#" MasterPageFile="~masterurl/default.master" Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage,Microsoft.SharePoint,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c"  %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ID="phPageTitle" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
    <SharePoint:ProjectProperty ID="ppTitle" Property="Title" runat="server"/>
</asp:Content>

<asp:Content ID="phMain" ContentPlaceHolderId="PlaceHolderMain" runat="server">
    <STYLE type='text/css'>
        #s4-leftpanel
        {
            display : none;
        }
        .s4-ca
        {
            margin-left : 0px !important;
        }

        #s4-searcharea
        {
            display : none;
        }
    </STYLE>

    <img src="19-0.gif" >
</asp:Content>

PDF作成後 Office365 (Sharepoint online) のドキュメントライブラリからpdfを読み込むHTML

<%@ Page language="C#" MasterPageFile="~masterurl/default.master" Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage,Microsoft.SharePoint,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c"  %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ID="phPageTitle" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">
    <SharePoint:ProjectProperty ID="ppTitle" Property="Title" runat="server"/>
</asp:Content>

<asp:Content ID="phMain" ContentPlaceHolderId="PlaceHolderMain" runat="server">
    <STYLE type='text/css'>
        #s4-leftpanel
        {
            display : none;
        }
        .s4-ca
        {
            margin-left : 0px !important;
        }

        #s4-searcharea
        {
            display : none;
        }
    </STYLE>

    <script type="text/javascript" src="pdfobject.js"></script>
    <script type="text/javascript">
        function getQueryVariable(variable) {
            var query = window.location.search.substring(1);
            var vars = query.split("&");
            for (var i = 0; i < vars.length; i++) {
                var pair = vars[i].split("=");
                if (pair[0] == variable) {
                    return pair[1];
                }
            }
            alert('Query Variable ' + variable + ' not found');
        }
        var pdfurl = decodeURIComponent(getQueryVariable("pdfurl"));
        document.write("<p>It appears you don't have Adobe Reader or PDF support in this web browser. <a href='" + pdfurl + "'>Click here to download the PDF</a></p>");
        var success = new PDFObject({ url: pdfurl }).embed();
    </script>
</asp:Content>

Silverlightの[PDF保存&表示]ボタンがクリックされたときの処理(C#)

        //PDFクリック処理
        private Byte[] m_dtPDF = new Byte[] { };
        private const string PDFWINDOWS_NAME = "PDFWindow";

        private void PDF_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                PDF.IsEnabled = false;

                //Excel Template Download from Office365 Document library
                //(Office365のドキュメントライブラリからExcel テンプレートを取得する)
                var client = new WebClient();
                client.OpenReadCompleted += Callback_OpenReadCompleted_PDF;
                string s = ApplicationContext.Current.Url + "/Lists/List_Template/AAAAAAAA.xlsx";
                client.OpenReadAsync(new Uri(s, UriKind.Absolute));

                //ユーザクリック時にPopUpWindows をここでOpenする(ここでIE Window OpenするとPopup Blockを回避できる。)
                string strURL = ApplicationContext.Current.Url + "/XXXXXXXXX/pdfobject/waiting.aspx";
                HtmlPage.Window.Invoke("ChildWindow_Open", PDFWINDOWS_NAME, strURL);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //Office365からExcelテンプレートバイナリデータを非同期で受け取る(Async)
        void Callback_OpenReadCompleted_PDF(object sender, OpenReadCompletedEventArgs e)
        {
            // エラーチェック
            if (e.Error != null)
            {
                ShowNormal(e.Error.Message);
                return;
            }

            System.IO.Stream sr = null;
            System.IO.BinaryReader br = null;

            try
            {
                sr = (System.IO.Stream)e.Result;
                br = new System.IO.BinaryReader(sr);

                m_dtPDF = new Byte[sr.Length];
                br.Read(m_dtPDF, 0, m_dtPDF.Length);
            }
            finally
            {
                if (br != null)
                {
                    br.Close();
                }

                if (sr != null)
                {
                    sr.Close();
                }
            }

            try
            {
                //Web Service にExcel Tempate とデータを送りPDFを受け取る
                Service_EAP_Excel.ExcelPortTypeClient excelPortTypeClient = new Service_EAP_Excel.ExcelPortTypeClient();
                excelPortTypeClient.Endpoint.Address = Define.ServiceModel_EndpointAddress;

                excelPortTypeClient.ToPDFCompleted += new EventHandler<Service_EAP_Excel.ToPDFCompletedEventArgs>(Callback_ToPDFCompleted);

                excelPortTypeClient.ToPDFAsync(m_dtPDF, textboxCustomerName.Text);
            }
            catch (Exception ex)
            {
                //InvokeしないとMessageBox動かない。
                Dispatcher.BeginInvoke(() =>{
                    MessageBox.Show(ex.Message);
                });

            }
        }

        //Web Serviceから非同期でPDFバイナリデータを受け取る(Async)
        private void Callback_ToPDFCompleted(object sender, Service_EAP_Excel.ToPDFCompletedEventArgs e)
        {
            try
            {
                if ((e.Error == null) && (e.Result != null) && (e.Result.PDF.Length > 0))
                {
                    System.IO.MemoryStream sr = null;
                    System.IO.BinaryReader br = null;
                    Byte[] dt = null;

                    try
                    {
                        sr = new System.IO.MemoryStream(e.Result.PDF);
                        //取得したバイナリデータを Byte[]に読み込み
                        br = new System.IO.BinaryReader(sr);
                        dt = new Byte[sr.Length];
                        br.Read(dt, 0, dt.Length);

                        //読み込んだバイナリデータをOffice365(Sharepoint document)にアップロード
                        string siteURL = ClientContext.Current.Url;
                        string strListName = "List_Template";  //ドキュメントリストの名前
                        string strDocumentName = "test.pdf"; //ドキュメントファイルに保存する名前

                        UploadDocument uploadDocument = new UploadDocument();
                        uploadDocument.Async(siteURL, strListName, strDocumentName, dt, new UploadDocument_EventHandler(CallBack_UploadDocument));
                    }
                    finally
                    {
                        //ここはdtを削除??
                        dt = null;

                        if (br != null)
                        {
                            br.Close();
                        }

                        if (sr != null)
                        {
                            sr.Close();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //InvokeしないとMessageBox動かない。
                Dispatcher.BeginInvoke(() =>
                {
                    MessageBox.Show(ex.Message);
                });
            }
            finally
            {
                PDF.IsEnabled = true;
            }
        }

        public void CallBack_UploadDocument(bool IsSuccess, string strMessage)
        {
            try
            {
                if (IsSuccess)
                {
                    //Popup Window のURL変更する。 
                    //Async(非同期処理)内では HtmlPage.PopupWindow は動作しない
                    //また、できたとしても ユーザがボタンクリックしたイベントでないのでIEにポップアップブロックされる(pop up block)
                    string strURL = ApplicationContext.Current.Url + "/XXXXXXXXX/pdfobject/pdfobject.aspx?pdfurl=" + HttpUtility.UrlEncode(ApplicationContext.Current.Url + "/Lists/List_Template/test.pdf");
                    this.Dispatcher.BeginInvoke(() => HtmlPage.Window.Invoke("ChildWindow_SetLocation", PDFWINDOWS_NAME, strURL));
                }
                else
                {

                    this.Dispatcher.BeginInvoke(new Action(delegate()
                    {
                        ShowNormal(strMessage);
                    }), null);
                }
            }
            catch (Exception ex)
            {
                ShowException(ex);
            }
        }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;
using System.Collections.ObjectModel;

namespace SilverlightProjectMain
{
    //デリゲート
    public delegate void UploadDocument_EventHandler(bool IsSuccess, string strMessage);

    public class UploadDocument
    {
        private UploadDocument_EventHandler _uploadDocument_EventHandler;

        private void SetCallBack(UploadDocument_EventHandler del)
        {
            _uploadDocument_EventHandler = del;
        }

        private void CallCallBack(bool IsSuccess, string strMessage)
        {
            _uploadDocument_EventHandler(IsSuccess, strMessage);
        }

        public void Async(string siteURL, string strListName, string strDocumentName, byte[] documentStream, UploadDocument_EventHandler uploadDocument_EventHandler)
        {
            SetCallBack(uploadDocument_EventHandler);

            using (ClientContext clientContext = new ClientContext(siteURL))
            {

                List list = clientContext.Web.Lists.GetByTitle(strListName);
                FileCreationInformation fileCreationInformation = new FileCreationInformation();

                fileCreationInformation.Content = documentStream;
                fileCreationInformation.Overwrite = true;
                fileCreationInformation.Url = strDocumentName;

                SP.File uploadFile = list.RootFolder.Files.Add(fileCreationInformation);
                //uploadFile.ListItemAllFields["DocType"] = "Favourites";
                uploadFile.ListItemAllFields.Update();
                clientContext.ExecuteQueryAsync(
                    new ClientRequestSucceededEventHandler(delegate(object o, ClientRequestSucceededEventArgs successargs)
                    {
                        CallCallBack(true, "");
                    }),
                    new ClientRequestFailedEventHandler(delegate(object o, ClientRequestFailedEventArgs failedArgs)
                    {
                        CallCallBack(false, failedArgs.ErrorDetails + "   " + failedArgs.Message);
                    })
                );

            }
        }

    }
}

Filed Under: Office365 App

About the Author

野呂清二(ご連絡はこちらまで (http://www.exceedone.co.jp/inquiry/)

Leave a Reply




If you want a picture to show with your comment, go get a Gravatar.