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 网站下载了代码。下面有3个函数DefineStyles()、CreatePage()、FillContent()。我对函数 CreatePage()、FillContent() 进行了更改;但是当我运行程序时,我收到错误消息

异常参数:指定参数超出有效值范围。

在 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);

我应该使用 2 而不是 3 的行数。

于 2012-05-25T12:25:29.330 回答