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を追加する。

[html title=”default.aspx” highlight=”51,52,53,54,55,56,57,58,59″]
<%@ 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>
[/html]

PDF作成中に表示するHTML

[html title=”waiting.aspx” highlight=”31″]
<%@ 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>

[/html]

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

[html title=”pdfobject.aspx” highlight=”46″]
<%@ 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>
[/html]

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

[csharp title=”SubPage_Quotation.xaml.cs” highlight=”20, 110, 153″]
//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);
}
}
[/csharp]

[csharp title=”UploadDocument”]
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);
})
);

}
}

}
}

[/csharp]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA