1
static void Main(string[] args)
    {
        string saveFileAs = "D:\\Hello.pdf";
        Program p = new Program();
        Document doc = p.CreateDocument();
        PdfDocumentRenderer renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always);
        renderer.Document = doc;
        renderer.RenderDocument();
        renderer.PdfDocument.Save("D:\\Hello.pdf");
        Process.Start(saveFileAs);
    }

public Document CreateDocument()
    {
        // Create a new MigraDoc document
        this.document = new Document();
        this.document.Info.Title = "A sample invoice";
        this.document.Info.Subject = "Demonstrates how to create an invoice.";
        this.document.Info.Author = "Chandana Amarnath";

        DefineStyles();

        CreatePage();

        FillContent();

        return this.document;
   }

void CreatePage()
    {
        // Each MigraDoc document needs at least one section.
        Section section = this.document.AddSection();

        // Put a logo in the header
        Image image = section.Headers.Primary.AddImage("D:\\Cubes.jpg");
        image.Height = "2.5cm";
        image.LockAspectRatio = true;
        image.RelativeVertical = RelativeVertical.Line;
        image.RelativeHorizontal = RelativeHorizontal.Margin;
        image.Top = ShapePosition.Top;
        image.Left = ShapePosition.Right;
        image.WrapFormat.Style = WrapStyle.Through;

        // Create footer
        Paragraph paragraph = section.Footers.Primary.AddParagraph();
        // The following one prints at the footer;
        paragraph.AddText("Aldata Inc.");
        paragraph.Format.Font.Size = 9;
        paragraph.Format.Alignment = ParagraphAlignment.Center;

        // Create the text frame for the address
        this.addressFrame = section.AddTextFrame();
        this.addressFrame.Height = "3.0cm";
        this.addressFrame.Width = "7.0cm";
        this.addressFrame.Left = ShapePosition.Left;
        this.addressFrame.RelativeHorizontal = RelativeHorizontal.Margin;
        this.addressFrame.Top = "5.0cm";
        this.addressFrame.RelativeVertical = RelativeVertical.Page;

        // Put sender in address frame
        paragraph = this.addressFrame.AddParagraph("Aldata-Apollo Inc.");
        paragraph.Format.Font.Name = "Times New Roman";
        paragraph.Format.Font.Size = 7;
        paragraph.Format.SpaceAfter = 3;

        // Add the print date field
        paragraph = section.AddParagraph();
        paragraph.Format.SpaceBefore = "8cm";
        paragraph.Style = "Reference";
        paragraph.AddFormattedText("Section Comparator", TextFormat.Bold);
        paragraph.AddTab();
        paragraph.AddText("Date: ");
        paragraph.AddDateField("dd.MM.yyyy");

        // Create the item table
        this.table = section.AddTable();
        this.table.Style = "Table";
        this.table.Borders.Color = Color.Parse("Black");
        this.table.Borders.Width = 0.25;
        this.table.Borders.Left.Width = 0.5;
        this.table.Borders.Right.Width = 0.5;
        this.table.Rows.LeftIndent = 0;

        //************ Before you can add a row, you must define the columns **********
        Column column = this.table.AddColumn("4cm");
        column.Format.Alignment = ParagraphAlignment.Center;

        column = this.table.AddColumn("3cm");
        column.Format.Alignment = ParagraphAlignment.Right;

        // Create the header of the table
        Row row = table.AddRow();
        row.HeadingFormat = true;
        row.Format.Alignment = ParagraphAlignment.Center;
        row.Format.Font.Bold = true;
        row.Shading.Color = Color.Parse("White");

        row.Cells[0].AddParagraph("Added");
        row.Cells[0].Format.Font.Bold = true;
        row.Cells[0].Format.Alignment = ParagraphAlignment.Center;
        row.Cells[0].MergeRight = 3;

        row = table.AddRow();
        row.HeadingFormat = true;
        row.Format.Alignment = ParagraphAlignment.Center;
        row.Format.Font.Bold = true;
        row.Cells[0].AddParagraph("Deleted Items");
        row.Cells[0].Format.Font.Bold = true;
        row.Cells[0].Format.Alignment = ParagraphAlignment.Left;
        row.Cells[0].MergeRight = 3;

        this.table.SetEdge(0, 0, 2, 3, Edge.Box, BorderStyle.Single, 0.75, Color.Empty);
    }

   void FillContent()
    {
        string xmlFileName = "C:\\Section.xml";
        XPathDocument xPathDocument = new XPathDocument(xmlFileName);
        XPathNavigator item = xPathDocument.CreateNavigator();

        XPathNodeIterator iter = item.Select("/Hello/*");
        while (iter.MoveNext())
        {
            string name = iter.Current.Name;
            item = iter.Current;
            Row row1 = this.table.AddRow();
            Row row2 = this.table.AddRow();

            row1.TopPadding = 1.5;
            row1.Cells[0].Shading.Color = Color.Parse("Gray");
            row1.Cells[0].VerticalAlignment = VerticalAlignment.Center;
            row1.Cells[0].MergeDown = 1;
            row1.Cells[1].Format.Alignment = ParagraphAlignment.Left;
            row1.Cells[1].MergeRight = 3;
            row1.Cells[0].AddParagraph(item.ToString());

            Console.WriteLine(name + "\t:" +item);
        }
        Console.ReadKey();
    }

MigraDoc を使用してレポートを PDF で生成するためのコードを書いています。PDFSharp サイトからコードをダウンロードしました。以下には、DefineStyles()、CreatePage()、FillContent() の 3 つの関数があります。関数 CreatePage()、FillContent(); を変更しました。しかし、プログラムを実行していると、エラーが発生します

Argument out of Exception: 指定された引数が有効な値の範囲外でした。

CreatePage() で、テーブルに 2 つの行と 2 つの列を追加しました。FillContent() 関数では、XML ファイルを読み取ります。しかし、インデックス範囲を超えている場所を見つけることができません。

解決した

問題は、table.SetEdge(...) を設定しているときです。作成していない列にアクセスしています。皆さんありがとう.. :)

4

1 に答える 1

1

このステップでは、まだ作成されていない行を設定していました。

this.table.SetEdge(0, 0, 2, 3, Edge.Box, BorderStyle.Single, 0.75, Color.Empty);

行数である3の代わりに2を使用する必要があります。

于 2012-05-25T12:25:29.330 に答える