ASP.NET medium trustでのActiveReportsの動作を試す
Windows Azure trustがASP.NET medium trust相当だとするならば、まずはActiveReportsをASP.NET medium trustで動作させ、どのような制限が加わるか、そして、それをどのように解決すればよいかを調べてみます。
ASP.NET 4でのActiveReports for .NET 6.0Jの使用は、Visual Studio 2010対応版で動作保障されています。そのため、ASP.NET medium trustの動きを事前に把握することで、動作保障のないWindows Azure環境での動きで不具合が生じたときに、Windows Azure環境特有の問題かどうかの判断ができるはずです。
プログラムの流れ
- 「Default.aspx」で[PDF]ボタンをクリックし、「CZ1009Reports.aspx」にリダイレクトする
- 「CZ1009Reports.aspx」では、PDF形式のバイナリデータを「CZ1009Reports.aspx」からブラウザへのレスポンスとする
- ブラウザ側でAdobe ReaderによりPDF表示
Imports DataDynamics.ActiveReports
Imports DataDynamics.ActiveReports.Export.Pdf
Public Class ActiveReportsClass
Private block As Object = Nothing
''' <summary>
''' PDFデータを取得する
''' </summary>
Public Function GetPdfDatas() As Byte()
Dim memStream As System.IO.MemoryStream
Dim ds As DataSet = GetRecords()
Using _rpt As New CZ1009ReportsClass
_rpt.Document.Printer.PrinterName = ""
_rpt.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.A4
_rpt.PageSettings.Orientation = Document.PageOrientation.Portrait
_rpt.PageSettings.Margins.Top = ActiveReport.CmToInch(0.5F)
_rpt.PageSettings.Margins.Bottom = ActiveReport.CmToInch(0.5F)
'データを割り当てる
_rpt.DataSource = ds.Tables("Enviroment")
' レポートを作成
_rpt.Run(False)
'pdfエクスポートオブジェクトを生成します
Using _pdf = New PdfExport
' PDFの出力用のメモリストリームを作成します
memStream = New System.IO.MemoryStream
' メモリストリームにPDFエクスポートを行います
_pdf.Security.Use128Bit = True
_pdf.Security.OwnerPassword = "hatsune"
_pdf.Security.Permissions = PdfPermissions.AllowPrint
_pdf.Security.Encrypt = True
_pdf.Export(_rpt.Document, memStream)
End Using
End Using
Return memStream.ToArray()
End Function
End Class
medium trust制限をかけないときの動作
Visual Studio 2010のASP.NET Webアプリケーションテンプレートで新規作成したASP.NET Webアプリケーションは、medium trust制限がかかっていません。この状態でまずは動作させて、プログラムコードが意図したとおりに動くかを確認します。
ASP.NET medium trustでの動作
ASP.NET medium trustに設定するためには、「Web.config」にtrust要素を追加します。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<trust level="Medium"></trust>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
</system.web>
</configuration>
図4のとおり、medium trustの場合、指定したフォントと異なるフォントが印字され、位置なども正しくありません。
PDFフォントファクトリを設定する
ActiveReportsのヘルプに、「PDFフォントファクトリ」を使えばmedium trustであっても、指定したフォントが印字されることが記載されていたので、試してみます。
PDFフォントファクトリの設定は「Web.config」で行います。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="ActiveReports.PdfExport">
<section name="FontFactory"
type="DataDynamics.ActiveReports.Web.FontFactorySectionHandler,ActiveReports.Web,
Version=6.2.2659.1, Culture=neutral,PublicKeyToken=cc4967777c49a3ff"
requirePermission="false"/>
</sectionGroup>
</configSections>
<ActiveReports.PdfExport>
<FontFactory Mode="File">
<AddFolder VirtualPath="~/Fonts" Recurse="true"/>
<Substitute Font="Helv" To="Helvetica"/>
<SetFallbackFont Font="Arial"/>
<!-- font link nodes -->
<AddFontLink Font="Arial" List="SimSun,gulim,PMingLiU"/>
<AddFontLink Font="Tahoma" List="MS UI Gothic,SimSun,gulim,PMingLiU"/>
<AddFontLink Font="MS UI Gothic" List="SimSun,gulim,PMingLiU,Microsoft Sans Serif" IsDefault="true"/>
</FontFactory>
</ActiveReports.PdfExport>
<system.web>
<trust level="Medium"></trust>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
</system.web>
</configuration>
次に、プロジェクトに「Fonts」フォルダを作成して、そこに「C:\Windows\Fonts」フォルダから目的のフォントファイルをコピーしておきます(サンプルにはフォルダが含まれていますが、フォントファイルは含んでいません)。
PDFフォントファクトリを設定し、実際に動かしてみると、図5のように正しいPDFへの印字結果を得ることができました。プログラムコード側は1行の変更も必要ありませんでした。

なお、PDFフォントファクトリを使ったアプリケーションを配布するときは、今回のサンプルのように、「Fonts」フォルダにコピーするフォントファイルは、設置先の実環境からコピーするのがよいでしょう。

しかし、最も良いのは、medium trustでアプリケーションを実行する必要があるかどうかを検討することだと思います。


