Uncategorized

SharePoint Online で PDF ファイルを活用する

こんにちは。

Office 365 コミュニティ ブログ で書かれているように、Office 365 Update によって、SharePoint Online で PDF ファイルの閲覧が可能です。この Update は、5 月末までの展開 (roll out) 完了予定で、もう皆さんの環境 (SharePoint Online) でも反映されていることでしょう。

ということで、今回は、この機能について簡単に紹介します。

まず、この機能は、Adobe Reader がインストールする ActiveX コントロールとの協調動作となるため、さまざまな情報ソースにも書かれていますが、必ず、以下の環境設定をおこなって使用してください。

  • 使用するクライアント (ブラウザー側のマシン) に、Adobe Acrobat Reader 10.1.2 以上をインストールしてください。バージョンが古いと、Acrobat の ActiveX が対応していないため、クリック時に、「ダウンロード」(ファイルの保存) が表示されます。
  • Internet Explorer のインターネット オプションで、[信頼済みサイト] (Trusted Site) に、お使いの SharePoint Online のサイトのドメインを登録してください。
  • SharePoint Online のログイン時に、「サインアウトしない」 (Keep me signed in) を選択して、ログインしてください。(起動するアプリケーションの画面上でもログインが維持されるようにするためです。)

SharePoint Online で PDF ファイルをドキュメント ライブラリーに登録すると、一見、エラー アイコンのようなものが表示されますが、実は、これは「PDF」を意味するアイコンです。(細かな理由は書きませんが、きっと、いろんな理由があったのでしょう。) 大きいアイコンで見ると、以下のように、ちゃんと「PDF」と書いていますね。

登録されたファイルをクリックすると、Adobe Reader が起動し、下図のダイアログ ボックスが表示されます。あとは、開いたり、チェックアウトするなどして、そのまま閲覧が可能です。

さて、プログラマーの方は、この機能を機能開発などで、どんどん活用してみましょう。
例えば、Adobe Acrobat Pro などで PDF フォームを作成し、SharePoint のリストのプロパティとプログラムを使って同期させることで、PDF フォームの内容を SharePoint 上に収集し、Excel と連携して集計などをおこなうことができます。(ちょうど、InfoPath フォームが、PDF フォームになったイメージです。)

下記は、PDF フォームがアップロード (またはチェックイン) された際に、リスト アイテムのプロパティを変更するサンプル コード (C#) です。著名な iTextSharp のライブラリーを使用しています。
(逆に、アイテムのプロパティが変更された際に、PDF ファイルに反映することもできます。)

. . .using iTextSharp;using iTextSharp.text;using iTextSharp.text.pdf;using iTextSharp.text.xml;using System.IO;. . .public class PDFListEventReceiver : SPItemEventReceiver{  //  // handle add, update, and check-in  //  public override void ItemAdded(SPItemEventProperties properties)  {bool status = this.EventFiringEnabled;this.EventFiringEnabled = false;SPListItem item = properties.ListItem;SPFile file = item.File;InternalUpdate(item, file);this.EventFiringEnabled = status;base.ItemAdded(properties);  }  public override void ItemUpdated(SPItemEventProperties properties)  {bool status = this.EventFiringEnabled;this.EventFiringEnabled = false;SPListItem item = properties.ListItem;SPFile file = item.File;InternalUpdate(item, file);this.EventFiringEnabled = status;base.ItemUpdated(properties);  }  public override void ItemCheckedIn(SPItemEventProperties properties)  {bool status = this.EventFiringEnabled;this.EventFiringEnabled = false;SPListItem item = properties.ListItem;SPFile file = item.File;InternalUpdate(item, file);this.EventFiringEnabled = status;base.ItemCheckedIn(properties);  }  //  // read PDF form, and update listitem  //  internal void InternalUpdate(SPListItem item, SPFile file)  {using (Stream stream = file.OpenBinaryStream()){  PdfReader pdfReader = new PdfReader(stream);  item["FullName"] = pdfReader.AcroFields.GetField("person");  string satString = pdfReader.AcroFields.GetField("question1");  if (satString == "t_verygood")item["satisfaction"] = 5;  else if (satString == "t_good")item["satisfaction"] = 4;  else if (satString == "t_bad")item["satisfaction"] = 2;  else if (satString == "t_verybad")item["satisfaction"] = 1;  elseitem["satisfaction"] = 3;  item.Update();}  }}. . .

さらに高度な実装として、Contextual Ribbon を使って PDF ファイル独自の操作を呼び出したり、上記のようなイベント レシーバーを (サンドボックス ソリューションの) リスト定義 として配布することで、PDF を活用した高度なソリューションを 1 つのインストーラー (.wsp) として提供し、SharePoint Online に展開できます。
以前、Adobe 社のイベント (Adobe License User Forum) に登壇した際に お見せしたデモ は、まさに、この方法でプログラミングしていました。

なお、試してみましたが、PDF をドキュメント テンプレートに設定しても、残念ながら作成・編集はできないようです。(ActiveX コントロールの Create が呼ばれるのですが、Acrobat が対応していません。まあ、ここ、PDF フォームの新規入力ではなく、PDF ファイル自体の新規作成の機能になってしまうので、そのまま使えないんですけどね。。。)

 

Categories: Uncategorized

Tagged as: ,

Leave a Reply