FlexGrid for WinForms
PDFへの保存
保存、ロード、印刷 > 保存 > PDFへの保存

FlexGrid を PDF として保存する最も簡単な方法は、System.PrintDocument クラスを使用することです。 その PrinterName プロパティを「Microsoft Print to PDF」に設定し、クラスの Print メソッドを呼び出すことができます。

var printDocument = _flexGrid.PrintParameters.PrintDocument;
printDocument.DocumentName = "Export to PDF";
printDocument.PrinterSettings.PrinterName = "Microsoft Print to PDF";
// ドキュメントをMicrosoftPDFプリンターに印刷します
 printDocument.Print();       
Dim printDocument = _flexGrid.PrintParameters.PrintDocument
printDocument.DocumentName = "Export to PDF"
printDocument.PrinterSettings.PrinterName = "Microsoft Print to PDF"
' ドキュメントをMicrosoftPDFプリンターに印刷します
printDocument.Print()             

ただし、この方法にはいくつかの制限があり、境界線の設定、特定のページまたは段区切りによる印刷などの高度なオプションを設定することはできません。これらの種類の高度なエクスポート オプションを実装するには、付属の C1PrintDocument ライブラリの C1PrintDocument クラスを使用できます。以下のセクションに示すように、ComponentOne WinForms Edition を使用します。

PDFへの高度なエクスポート

詳細オプションを使用してグリッドを PDF にエクスポートするには、ページごとに行と列を定義してグリッドの画像を作成し、各ページに描画する行と列の範囲を見つける必要があります。 次に、これらの画像を追加して、C1PrintDocument クラスを使用して PDF を生成します。 以下は、PDF への高度なエクスポートを実装するための詳細な手順とサンプル コードです。

手順 1: 範囲を作成する

最初に、定義されたページごとの行とページごとの列に従って UserData プロパティを設定する必要があります。 これは、PDF ドキュメントの各ページに描画される行と列の範囲を見つけるのに役立ちます。 したがって、このステップは、次のステップでグリッドのイメージを作成するための土台として機能します。

// ページごとに行/列を取得します
int rpp = 10;
int cpp = 3;
try
{
    rpp = int.Parse(_rpp.Text);
    cpp = int.Parse(_cpp.Text);
}
catch { }

// 行の区切り/列の区切りでグリッドをマークします。
for (int r = _flex.Rows.Fixed; r < _flex.Rows.Count; r++)
{
    _flex.Rows[r].UserData = (r % rpp == 0)
        ? "*"
        : null;
}
for (int c = _flex.Cols.Fixed; c < _flex.Cols.Count; c++)
{
    _flex.Cols[c].UserData = (c % cpp == 0)
        ? "*"
        : null;
}
Dim rpp As Integer = 10
Dim cpp As Integer = 3
Try
    rpp = Integer.Parse(_rpp.Text)
    cpp = Integer.Parse(_cpp.Text)
Catch ex As Exception
End Try
For r As Integer = _flex.Rows.Fixed To _flex.Rows.Count - 1
    _flex.Rows(r).UserData = If((r Mod rpp = 0), "*", Nothing)
Next

For c As Integer = _flex.Cols.Fixed To _flex.Cols.Count - 1
    _flex.Cols(c).UserData = If((c Mod cpp = 0), "*", Nothing)
Next            

手順 2: グリッド イメージを作成する

ここで、C1FlexGrid クラスの CreateImage メソッドを使用してグリッドの画像を作成するカスタム クラス(この場合は FlexPDFCreator)を作成します。 イメージは、上記の手順で設定した UserData プロパティに基づいて作成されます。

public class FlexPdfCreator
{
    // ** fields
    private ArrayList _images;
    private ArrayList _rowOnPage;
    private ArrayList _colOnPage;
    private int _rpp, _cpp;
    // ** ctor
    public FlexPdfCreator(C1FlexGrid flex, int _rpp, int _cpp)
    {
        // ページの画像を作成します
        _images = new ArrayList();
        _colOnPage = new ArrayList();
        _rowOnPage = new ArrayList();
        this._rpp = _rpp;
        this._cpp = _cpp;

        // 初期化
        int r1, c1, r2, c2;

        // 区切りを探して列をループします
        c1 = c2 = flex.Cols.Fixed;
        for (int c = flex.Cols.Fixed; c < flex.Cols.Count; c++)
        {
            // これが列区切りかどうかを確認します
            if (c == flex.Cols.Count - 1 ||
                (flex.Cols[c].UserData != null && flex.Cols[c].UserData.ToString() == "*"))
            {
                // 区切りが見つかりました。 列範囲は c1-c です
                c2 = c;

                // ブレークを探して行をループします。
                r1 = r2 = flex.Rows.Fixed;
                for (int r = flex.Rows.Fixed; r < flex.Rows.Count; r++)
                {
                    // 次の行の区切りを探します。
                    if (r == flex.Rows.Count - 1 ||
                        (flex.Rows[r].UserData != null && flex.Rows[r].UserData.ToString() == "*"))
                    {
                        // 区切りが見つかりました。 行範囲は r1-r です
                        r2 = r;

                        // イメージを作成します
                        _images.Add(flex.CreateImage(r1, c1, r2, c2));
                        _rowOnPage.Add(r2 - r1);
                        _colOnPage.Add(c2 - c1);

                        // 行範囲を更新します
                        r1 = r + 1;
                    }
                }

                // 列範囲を更新します
                c1 = c + 1;
            }
        }
    }
Public Class FlexPdfCreator
    Private _images As ArrayList
    Private _rowOnPage As ArrayList
    Private _colOnPage As ArrayList
    Private _rpp, _cpp As Integer
    Public Sub New(ByVal flex As C1FlexGrid, ByVal _rpp As Integer, ByVal _cpp As Integer)
        _images = New ArrayList()
        _colOnPage = New ArrayList()
        _rowOnPage = New ArrayList()
        Me._rpp = _rpp
        Me._cpp = _cpp
        Dim r1, c1, r2, c2 As Integer
        c1 = flex.Cols.Fixed
        c2 = flex.Cols.Fixed
        For c As Integer = flex.Cols.Fixed To flex.Cols.Count - 1
            If c = flex.Cols.Count - 1 OrElse (flex.Cols(c).UserData IsNot Nothing AndAlso flex.Cols(c).UserData.ToString() = "*") Then
                c2 = c
                r1 = flex.Rows.Fixed
                r2 = flex.Rows.Fixed
                For r As Integer = flex.Rows.Fixed To flex.Rows.Count - 1
                    If r = flex.Rows.Count - 1 OrElse (flex.Rows(r).UserData IsNot Nothing AndAlso flex.Rows(r).UserData.ToString() = "*") Then
                        r2 = r
                        _images.Add(flex.CreateImage(r1, c1, r2, c2))
                        _rowOnPage.Add(r2 - r1)
                        _colOnPage.Add(c2 - c1)
                        r1 = r + 1
                    End If
                Next
                c1 = c + 1
            End If
        Next
    End Sub           

手順 3: PDF ドキュメントを生成する

この手順では、ComponentOne WinForms Edition に同梱されている class of the C1PrintDocument ライブラリの C1PrintDocument クラスを使用してドキュメントを作成します。 RenderImage クラスを使用して作成した画像をこのドキュメントに追加し、最後に Export メソッドを使用して PDF ドキュメントを保存します。

public void Save(string fileName)
{
    int perUnitWidth = 250 / _cpp;
    int perUnitHeight = 190 / _rpp;
    // 新しい C1PrintDocument を作成します
    C1PrintDocument c1PrintDocument1 = new C1PrintDocument();
    c1PrintDocument1.AllowNonReflowableDocs = true;
    RenderArea ra1 = new RenderArea();
    // ドキュメントに画像を追加します
    for (int page = 0; page < _images.Count; page++)
    {
        Image img = _images[page] as Image;
        RenderImage ri1 = new RenderImage(img);
        ri1.Width = perUnitWidth * (int)_colOnPage[page] + "mm";
        ri1.Height = perUnitHeight * (int)_rowOnPage[page] + "mm";
        ra1.Children.Add(ri1);

    }
    c1PrintDocument1.Body.Children.Add(ra1);
    c1PrintDocument1.Reflow();
    c1PrintDocument1.Export(fileName);
}
Public Sub Save(ByVal fileName As String)
        Dim perUnitWidth As Integer = 250 / _cpp
        Dim perUnitHeight As Integer = 190 / _rpp
        Dim c1PrintDocument1 As C1PrintDocument = New C1PrintDocument()
        c1PrintDocument1.AllowNonReflowableDocs = True
        Dim ra1 As RenderArea = New RenderArea()

        For page As Integer = 0 To _images.Count - 1
            Dim img As Image = TryCast(_images(page), Image)
            Dim ri1 As RenderImage = New RenderImage(img)
            ri1.Width = perUnitWidth * CInt(_colOnPage(page)) & "mm"
            ri1.Height = perUnitHeight * CInt(_rowOnPage(page)) & "mm"
            ra1.Children.Add(ri1)
        Next
        c1PrintDocument1.Body.Children.Add(ra1)
        c1PrintDocument1.Reflow()
        c1PrintDocument1.Export(fileName)
    End Sub
End Class