2

主に印刷するために C# でドキュメントを作成しようとしています。基本的には、データベースのオブジェクトの値を入力するフォームです。

私が過去に使用していたコードは、醜く、長く、書くのが面倒で、維持するのがさらに困難です。

public class MyDoc : PrintDocument
{
    private MyContainer _myObject; //Inherits from list.

    private int PageCount()
    {
        return (int)Math.Ceiling(_myObject.Count / 5f);
    }

    protected override void OnPrintPage(PrintPageEventArgs e)
    {
        Graphics g = e.Graphics;
        g.PageUnit = GraphicsUnit.Millimeter;

        Font bigFont = new Font("Arial", 16, FontStyle.Regular, GraphicsUnit.Point);
        Font mediumFont = new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Point);
        Font smallFont = new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Point);
        Font smallNumberFont = new Font("Courier New", 7, FontStyle.Regular, GraphicsUnit.Point);
        Pen linePen = new Pen(Brushes.Black, 0.2F);

        int rowPosition = 5;
        int rowIncrement = 9;

        g.DrawString(string.Format("Page {0} of {1}", _pageNumber, PageCount()), smallFont, Brushes.Black, 175, rowPosition);
        rowPosition = 15;

        g.DrawImage(Image.FromFile("myfile.jpg"), 127, rowPosition);

        g.DrawString("Name:", smallFont, Brushes.Black, 3, rowPosition);
        g.DrawString(_myObject.Name, smallBoldFont, Brushes.Black, 50, rowPosition);
        rowPosition += rowIncrement;

        //Sub-Items Table Header
        g.DrawRectangle(linePen, 3, rowPosition, 35, 10);
        g.DrawRectangle(linePen, 38, rowPosition, 85, 10);
        g.DrawRectangle(linePen, 123, rowPosition, 25, 10);
        g.DrawRectangle(linePen, 148, rowPosition, 20, 10);
        g.DrawRectangle(linePen, 168, rowPosition, 25, 10);

        foreach (var i in _myObject)
        {
            //Draw a grid and write out all details of everything in the collection.
            //If there are 2 many, stop and we will create a page 2.
        }

        //Write Standard page footer
        //etc etc.
    }
}

また、新しい要件として、これを pdf または画像に保存する必要があります。

基本的に、私は 300 ~ 500 行のコードを書いて、ややまともなドキュメントを作成しています。

非常に似たようなことをする必要があり、より良い方法が必要です!


私は考えました:

XAML - 次に、入力する必要があるプロパティをデータバインドします。ただし、2 つ以上のページに広がる処理方法がわかりません。

Word Interop - できるかどうかわかりません。Office がインストールされていない Web サーバー上で実行されます。(それが必要な場合は、いくつかの dll をパッケージ化できますが、よくわかりません。)

というわけで、みなさんのアイデアをお待ちしています。

外部ライブラリを使用したくないのですが、それが最善の方法である場合は、無料で適切なライセンスが必要です:)

4

1 に答える 1