PDFエクスポート時レポート上の日本語文字(2バイトコード)がPDFに反映されない
レポート上に配置したTextBoxやLabelのFontプロパティが、「MS Pゴシック」などの日本語フォントに設定され、文字セット(GdiCharSetプロパティ)が日本語(128)に設定されているかどうかを確認してください。
また、PDFドキュメントのファイルフォーマットバージョンを設定する、PDFExportクラスのVersion プロパティが、1.3以上に設定されている必要があります。
PDF形式にエクスポートできる情報は、製品をインストールしたフォルダ内のリリースノート「制限事項と注意点」を参照してください。
PDFエクスポートで用紙サイズが反映されない
作成したPDFをAdobe Reader上から印刷する際、レポート作成時に設定した用紙サイズが反映されません。
本現象は、Adobe Readerの印刷設定により発生しています。
Adobe ReaderからPDFファイルを印刷する際に使用される用紙のサイズは、その環境の「通常使うプリンター」で設定されている、デフォルトの用紙サイズになります。たとえば、A3サイズでPDFを作成しても、PDFを印刷する環境のデフォルトの用紙サイズがA4の場合には、印刷時に用紙サイズを切り替える必要があります。
これはActiveReportsを使用して作成したPDFだけでなく、PDFを印刷する際の一般的な動作になりますので、あらかじめご注意ください。
詳細については、Adobe社の情報を参照してください。
PDFを印刷すると全体的に小さく(大きく)なる
PDFに出力したレポートをAdobe Readerで印刷すると、ActiveReportsから印刷した場合に比べて、全体的に小さな(大きな)サイズで印刷されてしまいます。
本現象は、Adobe Readerの印刷設定により発生しています。
本現象を回避するには、Adobe ReaderでPDFファイルを開いた後に、[ファイル]メニューから[印刷]を選択し、以下のいずれかを実行します。
Acrobat 11.x 製品の場合
[ページサイズ処理] セクション から [なし] を選択します。
Acrobat 6.x / 7.x / 8.x / 9.x 製品の場合
[ページ処理] セクション の [ページの拡大 / 縮小] ポップアップメニューから [実際のサイズ] を選択します。
Acrobat 5.x 製品の場合
[印刷部数と調整] セクションの [用紙サイズを合わせてページを縮小]、[用紙サイズに合わせてページを拡大] のチェックを両方とも外します。
Acrobat 4.x 製品の場合
[プリンタ] セクションの [用紙サイズに合わせる] のチェックを外します。
また、プリンタドライバの機能や設定が関係している可能性もありますので、それらについても確認してください。
PDFのファイルサイズを小さくする
エクスポートしたPDFのファイルサイズは、次の2つの要素が大きく影響します。
フォントを埋め込まない
ActiveReportsのPDFエクスポートでは、PdfExportクラスのNeverEmbedFontsプロパティに設定されているフォント以外のフォントは、すべて埋め込みフォントとなります。埋め込みフォントとした場合、PDF内にフォントデータが格納されているため、その分ファイルサイズが大きくなります。使用しているフォントの名称をセミコロン区切りの文字列とし、NeverEmbedFontsプロパティに設定することで、PDFファイルのサイズを小さくすることができます。
Visual Basic
Visual Basicコード |
コードのコピー
|
---|---|
Dim rpt As New rptExports() Viewer1.Document = rpt.Document rpt.Run(False) ' 埋め込む必要のないフォントの名称を、セミコロンで区切った文字列を設定します。MS ゴシックなどの日本語フォントは、Professionalでのみ有効です。 PdfExport1.NeverEmbedFonts = "MS ゴシック;MS Pゴシック;MS 明朝;MS P明朝;MS UI Gothic" PdfExport1.Export(rpt.Document, Application.StartupPath + "\PDFExpt.PDF") |
C#
C#コード |
コードのコピー
|
---|---|
rptExports rpt = new rptExports(); this.viewer1.Document = rpt.Document; rpt.Run(false); // 埋め込む必要のないフォントの名称を、セミコロンで区切った文字列を設定します。MS ゴシックなどの日本語フォントは、Professionalでのみ有効です。 pdfExport1.NeverEmbedFonts = "MS ゴシック;MS Pゴシック;MS 明朝;MS P明朝;MS UI Gothic"; pdfExport1.Export(rpt.Document, Application.StartupPath + \\PDFExpt.PDF); |
画像はメタファイル形式を使用する
JPEG形式やPNG形式などのラスタ形式の画像データは、文字データに比べて非常に大きなデータです。WMF形式やEMF形式といったメタファイルを使用することで、PDFではベクタグラフィクスとして出力されるため、データ量が非常に小さくなります。なお、ベクタグラフィクスとして出力するためには、PdfExportクラスのConvertMetaToPng プロパティの値が、Falseに設定されている必要があります。
PDFに「しおり」を設定するには
「ブックマーク」を設定したレポートをPDFエクスポートすることで、PDFでは「ブックマーク」が「しおり」として出力されます。PDFに「しおり」を設定するには、ExportBookmarksプロパティをTrueに設定する必要があります。
PDFやExcelファイルをWebサーバー上に保存する
Exportメソッドの第2引数に、ファイル名のフルパスを指定することで、Webサーバー上の任意のフォルダにエクスポートしたファイルを保存することが可能です。
ただし、Webサーバー上にファイルを保存する場合、実行ユーザーがその保存先フォルダに対して書き込み権限を持っている必要があります。
たとえば、IIS7.0以降、IUSRSに対して書き込み権限を許可する必要があります。アクセス許可の詳細については、MSDNライブラリ等を参照してください。
Excelエクスポートの出力結果がずれる
ビューワで表示した結果とExcelエクスポートで出力した結果が異なっています。XlsExportクラスによるExcelエクスポートは、ActiveReports for .NETのデザイナで自由にレイアウトされたレポートをセル(グリッド)形式に変換するため、レポートの内容によっては、レポートのプレビュー結果とExcelにエクスポートした結果で、レイアウトに違いが発生する場合があります。
このような場合は、次のいずれかの方法で、ずれを防ぐことができます。
レイアウトを調整する
XlsExportクラスは、基本的に1つのTextBoxやLabelコントロールを1つのセルへ出力します。これらが、グリッドへ出力した場合に整列するように、コントロールの位置(Top,Left)やサイズ(Height,Width)を調整してください。
例えば、あるTextBox上に別のTextBoxが重なって配置されていたり、並べて配置している2つのTextBoxの高さが、一方では「0.488インチ」もう一方では「0.447インチ」などのようにずれがある場合などに、Excel上でセルの位置がずれる可能性があります。このような場合は、TextBox同士が重ならないように配置したり、高さを揃えるなどの調整を行ってください。
デザイナ上のコントロールの位置や高さは、[レポートの設定]ダイアログの[グローバル設定] - [ルーラの単位]で設定されたインチやcm単位で表示されますが、実際にRPXファイル内に保存される(レポート生成時に使用される)情報の単位は、Twips単位(1インチ=1440Twips)となります。そのため、[レポート設定]ダイアログ上で「コントロールをグリッドに合わせる」に設定されている状態でコントロールをドラッグした場合など、インチ(cm)からTwips単位への換算が行われる段階で小数点以下の誤差が発生することがあります。その結果、プロパティウィンドウ上で同じ高さに設定されているコントロールでも、RPXファイルに実際に記述されている高さが異なってしまい、結果的にExcel上でのセル位置や高さに影響を与えてしまう可能性があります。プロパティウィンドウ上でコントロールを同じ高さに設定しているにもかかわらず、Excelエクスポート時にセルの高さがずれるという場合は、コントロールの位置やサイズを一旦別の値に設定した上で、再度統一して設定し直すか、RPXファイル内の記述をテキストエディタで直接編集してください。
SpreadBuilder APIを使用する
上記のActiveReportsで作成したレポートをExcel形式にエクスポートする方法とは異なり、Excelのワークブックやワークシートを新規で作成する方法です。全ての処理をコード上に記述する必要がありますが、各セルに対して書式やフォントなどを詳細に設定することが可能です。
下記のサンプルコードでは、DetailのBeforePrintイベントで、セクションに配置されたTextBoxから値を取得し、ワークシート上のセルにセットしています。
Visual Basic
Visual Basicコード |
コードのコピー
|
---|---|
Private sb As GrapeCity.SpreadBuilder.Workbook Private Sub detail_BeforePrint(sender As Object, e As EventArgs) Dim rows As Integer = 0 ' 列、行およびセルに対し、プロパティや値を設定します。 sb.Sheets(0).Cell(rows, 0).SetValue(Me.textBox1.Text) sb.Sheets(0).Cell(rows, 0).FontName = "MS UI Gothic" sb.Sheets(0).Cell(rows, 0).BorderLeftStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 0).BorderTopStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 0).BorderRightStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 0).BorderBottomStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 1).SetValue(Me.textBox2.Text) sb.Sheets(0).Cell(rows, 1).FontName = "MS UI Gothic" sb.Sheets(0).Cell(rows, 1).BorderLeftStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 1).BorderTopStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 1).BorderRightStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 1).BorderBottomStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 2).SetValue(Me.textBox3.Text) sb.Sheets(0).Cell(rows, 2).FontName = "MS UI Gothic" ' 折り返して全体を表示します。 sb.Sheets(0).Cell(rows, 2).WrapText = True sb.Sheets(0).Cell(rows, 2).BorderLeftStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 2).BorderTopStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 2).BorderRightStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin sb.Sheets(0).Cell(rows, 2).BorderBottomStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin rows += 1 End Sub Private Sub rptExports_ReportStart(sender As Object, e As EventArgs) ' ワークブックのシートコレクションにシートを追加します。 sb = New GrapeCity.SpreadBuilder.Workbook() sb.Sheets.AddNew() sb.Sheets(0).Name = "SpreadBuilderSample" sb.Sheets(0).PageSetup.PaperSize = System.Drawing.Printing.PaperKind.A4 End Sub Private Sub rptExports_ReportEnd(sender As Object, e As EventArgs) ' ワークブックをExcelファイルへ保存します。 sb.Save(System.Windows.Forms.Application.StartupPath + "\SBSample.xls") End Sub |
C#
C#コード |
コードのコピー
|
---|---|
GrapeCity.SpreadBuilder.Workbook sb; private void detail_BeforePrint(object sender, EventArgs e) { int rows = 0; // 列、行およびセルに対し、プロパティや値を設定します。. sb.Sheets[0].Cell(rows, 0).SetValue(this.textBox1.Text); sb.Sheets[0].Cell(rows, 0).FontName = "MS UI Gothic"; sb.Sheets[0].Cell(rows, 0).BorderLeftStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 0).BorderTopStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 0).BorderRightStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 0).BorderBottomStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 1).SetValue(this.textBox2.Text); sb.Sheets[0].Cell(rows, 1).FontName = "MS UI Gothic"; sb.Sheets[0].Cell(rows, 1).BorderLeftStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 1).BorderTopStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 1).BorderRightStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 1).BorderBottomStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 2).SetValue(this.textBox3.Text); sb.Sheets[0].Cell(rows, 2).FontName = "MS UI Gothic"; // 折り返して全体を表示します。 sb.Sheets[0].Cell(rows, 2).WrapText = true; sb.Sheets[0].Cell(rows, 2).BorderLeftStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 2).BorderTopStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 2).BorderRightStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; sb.Sheets[0].Cell(rows, 2).BorderBottomStyle = GrapeCity.SpreadBuilder.Style.BorderLineStyle.Thin; rows += 1; } private void rptExports_ReportStart(object sender, EventArgs e) { // ワークブックのシートコレクションにシートを追加します。 sb = new GrapeCity.SpreadBuilder.Workbook(); sb.Sheets.AddNew(); sb.Sheets[0].Name = "SpreadBuilderSample"; sb.Sheets[0].PageSetup.PaperSize = System.Drawing.Printing.PaperKind.A4; } private void rptExports_ReportEnd(object sender, EventArgs e) { // ワークブックをExcelファイルへ保存します。 sb.Save(System.Windows.Forms.Application.StartupPath + "\\SBSample.xls"); } |
Excelエクスポートで「Error Creating File」というエラーが発生する
このエラーメッセージは、Excelエクスポート時、ファイル出力処理が実行できない場合に発生するエラーです。たとえば、下記のような場合に発生します。
Web上でExcelエクスポート
Excel形式に出力する例を説明します。
Visual Basic
Visual Basicコード |
コードのコピー
|
---|---|
Dim p As New GrapeCity.ActiveReports.Export.Excel.Section.XlsExport() Dim m_stream As New System.IO.MemoryStream() Dim rpt As New rptCustEx() rpt.Run(False) p.Export(rpt.Document, m_stream) m_stream.Position = 0 Response.ContentType = "application/vnd.ms-excel" Response.BinaryWrite(m_stream.ToArray()) Response.End() |
C#
C#コード |
コードのコピー
|
---|---|
GrapeCity.ActiveReports.Export.Excel.Section.XlsExport p = new GrapeCity.ActiveReports.Export.Excel.Section.XlsExport(); System.IO.MemoryStream m_stream = new System.IO.MemoryStream(); rptCustEx rpt = new rptCustEx(); rpt.Run(false); p.Export(rpt.Document, m_stream); m_stream.Position = 0; Response.ContentType = "application/vnd.ms-excel"; Response.BinaryWrite(m_stream.ToArray()); Response.End(); |
Textエクスポートで日本語文字が出力されない
TEXTエクスポート時レポート上の日本語文字(2バイトコード)が、「??????」と出力されます。
TextExportオブジェクトのEncodingプロパティの設定値が、デフォルトの「ASCII」のままである場合、2バイトコードが「??」としてエンコーディングされます。
Encodingプロパティの値を「Default」または「UTF8」に設定してください。
Visual Basic
Visual Basicコード |
コードのコピー
|
---|---|
Dim textExport1 As New GrapeCity.ActiveReports.Export.Xml.Section.TextExport() textExport1.Encoding = System.Text.Encoding.UTF8 textExport1.Export(rpt.Document, Application.StartupPath + \\TextExpt.txt) |
C#
C#コード |
コードのコピー
|
---|---|
GrapeCity.ActiveReports.Export.Xml.Section.TextExport textExport1 = new GrapeCity.ActiveReports.Export.Xml.Section.TextExport(); textExport1.Encoding = System.Text.Encoding.UTF8; textExport1.Export(rpt.Document, Application.StartupPath + "\\TextExpt.txt"); |
レポートをCSV形式のテキストファイルに出力する
ActiveReportsには、レポートの内容をCSV形式で出力する直接的な機能は用意されていませんが、レポートをText形式で出力するTextエクスポート機能を利用することで、それに近い動作が行えます。
たとえば、TextエクスポートフィルタのTextDelimiter プロパティに","(カンマ記号)を設定することで、各データがカンマ区切りでテキストファイルに出力されます。
ただし、Textエクスポートフィルタは、生成されたレポートをテキストとして出力する機能のため、データが存在しない(空文字の)場合には、区切り文字自体が出力されません。データが存在しない場合にも区切り文字を出力したい場合は、ダミー文字として半角スペースをセットしてください。
下記のサンプルコードは、データが存在しない場合、動的に空白データを含めます。このように、BeforePrintイベント内でTextBoxのTextプロパティを参照し、データが存在しない場合に、ダミー文字として半角スペースをセットします。
Visual Basic
Visual Basicコード |
コードのコピー
|
---|---|
Private Sub Detail1_BeforePrint(sender As System.Object, e As System.EventArgs) Handles Detail1.BeforePrint If (TextBox1.Text = "") Then TextBox1.Text = " " End If End Sub |
C#
C#コード |
コードのコピー
|
---|---|
Detail1_BeforePrint(System.Object sender, System.EventArgs e) { if ((string.IsNullOrEmpty(TextBox1.Text))) { TextBox1.Text = " "; } } |
レポートをJPEG形式やBMP形式の画像で出力する
セクションレポートの場合、レポートをJPEG形式やBMP形式などの画像ファイルとして保存するための機能は用意されていませんが、ActiveReportsのPage.Drawメソッドや.NET FrameworkのGraphicsやBitMapオブジェクトを使用することで実現可能です。
以下のサンプルコードを参考に、ご検討ください。
Visual Basic
Visual Basicコード |
コードのコピー
|
---|---|
Private Sub Form1_Load(...) Handles MyBase.Load ' セクションレポートを用意します。 Dim sectionReport As New SectionReport1() ' 先にRun()を実行する必要があります。 sectionReport.Run() ' 解像度を設定します。 Dim dpiX As Single = 100 Dim dpiY As Single = 100 ' JPEG形式で出力します。 Me.SectionDocumentToJpeg(sectionReport.Document, dpiX, dpiY) ' BMP形式で出力します。 Me.SectionDocumentToBmp(sectionReport.Document, dpiX, dpiY) ' 注意:同時にプレビューを行う場合、 ' Viewer1.LoadDocument の後に画像ファイルへの出力はできません。 ' DocummentのPagesがリセットされてしまうためです。 Me.Viewer1.LoadDocument(sectionReport) End Sub ' ドキュメントからJpegファイルへ出力するメソッドです。 Private Sub SectionDocumentToJpeg( _ ByVal doc As GrapeCity.ActiveReports.Document.SectionDocument, _ ByVal dpiX As Single, _ ByVal dpiY As Single) For i As Integer = 0 To doc.Pages.Count - 1 Dim bm As Bitmap bm = Me.SectionPageToBitmap(doc.Pages(i), dpiX, dpiY) Dim path As String = "report" & (i + 1).ToString("000") & ".JPG" bm.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg) Next End Sub ' ドキュメントからBMPファイルへ出力するメソッドです。 Private Sub SectionDocumentToBmp( _ ByVal doc As GrapeCity.ActiveReports.Document.SectionDocument, _ ByVal dpiX As Single, _ ByVal dpiY As Single) For i As Integer = 0 To doc.Pages.Count - 1 Dim bm As Bitmap bm = Me.SectionPageToBitmap(doc.Pages(i), dpiX, dpiY) Dim path As String = "report" & (i + 1).ToString("000") & ".BMP" bm.Save(path, System.Drawing.Imaging.ImageFormat.Bmp) Next End Sub ' 各ページからBitmapオブジェクトを作成するメソッドです。 Private Function SectionPageToBitmap( _ ByVal page As GrapeCity.ActiveReports.Document.Section.Page, _ ByVal dpiX As Single, _ ByVal dpiY As Single) As System.Drawing.Bitmap ' ページのサイズからBitmapを作成します。 Dim width As Integer = CInt(page.Width * dpiX) Dim height As Integer = CInt(page.Height * dpiY) Dim bm As New System.Drawing.Bitmap(width, height) bm.SetResolution(dpiX, dpiY) ' レポートと同じサイズのRectangleFを用意します。 Dim rec As RectangleF = New RectangleF(0, 0, page.Width, page.Height) ' BitmapからGraphicsオブジェクトを作成します。 Dim gp As Graphics gp = Graphics.FromImage(bm) gp.Clear(Color.White) ' ページをGraphicsに描画します。 page.Draw(gp, rec) Return bm End Function |
C#
C#コード |
コードのコピー
|
---|---|
private void Form1_Load(object sender, EventArgs e) { // セクションレポートを用意します。 SectionReport1 sectionReport = new SectionReport1(); // 先にRun()を実行する必要があります。 sectionReport.Run(); // 解像度を設定します。 float dpiX = 100; float dpiY = 100; // JPEG形式で出力します。 this.SectionDocumentToJpeg(sectionReport.Document, dpiX, dpiY); // BMP形式で出力します。 this.SectionDocumentToBmp(sectionReport.Document, dpiX, dpiY); // 注意:同時にプレビューを行う場合、 // Viewer1.LoadDocument の後に画像ファイルへの出力はできません。 // DocummentのPagesがリセットされてしまうためです。 this.viewer1.LoadDocument(sectionReport); } // ドキュメントからJpegファイルへ出力するメソッドです。 private void SectionDocumentToJpeg( GrapeCity.ActiveReports.Document.SectionDocument doc, float dpiX, float dpiY) { for (int i = 0; i < doc.Pages.Count; i++) { System.Drawing.Bitmap bm; bm = this.SectionPageToBitmap(doc.Pages[i], dpiX, dpiY); string path = "rpt" + (i + 1).ToString("000") + ".JPG"; bm.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg); } } // ドキュメントからBMPファイルへ出力するメソッドです。 private void SectionDocumentToBmp( GrapeCity.ActiveReports.Document.SectionDocument doc, float dpiX, float dpiY) { for (int i = 0; i < doc.Pages.Count; i++) { System.Drawing.Bitmap bm; bm = this.SectionPageToBitmap(doc.Pages[i], dpiX, dpiY); string path = "rpt" + (i + 1).ToString("000") + ".BMP"; bm.Save(path, System.Drawing.Imaging.ImageFormat.Bmp); } } // 各ページからBitmapオブジェクトを作成するメソッドです。 private System.Drawing.Bitmap SectionPageToBitmap( GrapeCity.ActiveReports.Document.Section.Page page, float dpiX, float dpiY) { // ページのサイズからBitmapを作成します。 int width = (int)(page.Width * dpiX); int height = (int)(page.Height * dpiY); var bm = new System.Drawing.Bitmap(width, height); bm.SetResolution(dpiX, dpiY); // レポートと同じサイズのRectangleFを用意します。 var rec = new RectangleF(0, 0, page.Width, page.Height); // BitmapからGraphicsオブジェクトを作成します。 Graphics gp; gp = Graphics.FromImage(bm); gp.Clear(Color.White); // ページをGraphicsに描画します。 page.Draw(gp, rec); return bm; } |