概要
WebでPDFのプレビュー機能を作りたいため、PDFをJPGに変換し、さらにBase64エンコードした話です。
環境
- サーバOS:Winサーバ 2012R2
- 提供:Webアプリ
- F/W:MVC5.Net
このために利用したライブラリ:Magick.NET
こんなWebシステム作ってました。このシステムではファイルを添付することができます。用途は主にPDFを想定してました。 当初の使い方としてはブラウザからダウンロードして見てもらえればいいと思ってましたが、一部のユーザから「ダウンロードしたらブラウザ上でPDFファイルが開いた。そのあとどうやって元の画面に戻ればいいかわからない」と問い合わせがあったそうです。 仕方なしにPDFをブラウザ上でプレビュー表示できるようにした話です。
実装方針
制約事項
- PDFはサーバの非公開領域においてある
- IE対応も必要
初めはサーバサイドでPDFをBase64エンコードし、フロント側で下記データで表示しようとしました。
<object data="data:application/pdf;base64,Base64エンコードしたデータ" type="application/pdf"></object>
が、表示されません。ググるとIEでは非対応)だそうです。許すまじIEですね。
ということで作戦変更です。
- サーバサイドでPDFを画像変換し更に変換したものをBase64エンコードする
- クライアントではBase64したデータをimgタグに注入する
実装
1研究中:C# Magick.NETを使ってみる。 こちらをかなり参考にしつつ進めていきました。1研究中さんを参考にNugetからMagick.NETをインストールします。 実際にPDFから画像に変換した後にBase64へしたのがこちら。
using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using NLog; using System.Web; using ImageMagick; namespace TestWeb.Controllers { public class APIHogeController : ApiController { private static Logger logger = LogManager.GetCurrentClassLogger(); public string GetBase64File() { try { var filePath = "C:\\\temp\\hogehoge.pdf"; // PDFファイルを画像に変換 var imagePath = convertPdf2Image(filePath); // 画像をBase64エンコード return Convert.ToBase64String(File.ReadAllBytes(imagePath)); } catch (Exception e) { logger.Error(String.Format(e.ToString())); logger.Error(String.Format(e.StackTrace)); throw new Exception(); } } // PDF を画像ファイルに変換 private string convertPdf2Image(string pdfPath) { // 画像ファイルの保存場所 var imagePath = "C:\\\temp\\fugafuga.jpg"; // ImageMagick の設定 MagickReadSettings settings = new MagickReadSettings(); settings.Density = new Density(150); using (MagickImageCollection images = new MagickImageCollection()) { images.Read(pdfPath, settings); using (IMagickImage vertical = images.AppendVertically()) { vertical.Alpha( AlphaOption.Remove); // 透過を除去(透過部分が黒くなるので) vertical.Write(imagePath); } } return imagePath; } } }
ApiControllerが元になってたり、不要なものをインポートしてますが脳内置換していただけると幸いです。
上記の要領でBase64に変換したものをフロントにてimgタグに注入すればOKです。
対象ブラウザ:IEを謳ってなければこんなことをしなくて済んだんですよね。IE許すまじ。。
0 件のコメント :
コメントを投稿