自动PDF渲染

时间:2016-05-19 17:00:20

标签: vb.net pdfsharp migradoc

我已经阅读了MigraDoc / PdfSharp文档,但感觉有点薄。我想渲染PDF,但不必手动指定宽度和高度。我只是希望它对齐,居中或左边(边距),并为我处理所有尺寸。

Public Sub Write()
    Dim document As PdfDocument = New PdfDocument()
    Dim page As PdfPage = document.AddPage()

    Dim gfx As XGraphics = XGraphics.FromPdfPage(page)
    gfx.MUH = PdfFontEncoding.Unicode
    gfx.MFEH = PdfFontEmbedding.Default

    Dim font As XFont = New XFont("Verdana", 13, XFontStyle.Bold)

    Dim migraDocument As New Document

    Dim sec As Section = migraDocument.AddSection()

    Dim quotationHeader As New Paragraph
    quotationHeader.AddText("Quotation" & vbNewLine)
    quotationHeader.Format.Alignment = ParagraphAlignment.Right
    sec.Add(quotationHeader)

    Dim dhAddressInfo As New Paragraph
    dhAddressInfo.AddText("ADDRESS GOES HERE")
    dhAddressInfo.Format.Alignment = ParagraphAlignment.Left
    sec.Add(dhAddressInfo)

    Dim quotationInfo As New Paragraph
    quotationInfo.AddText("QUOTATION INFO AND DATE HERE")
    quotationInfo.Format.Alignment = ParagraphAlignment.Right
    sec.Add(quotationInfo)

    Dim customerBilling As New Paragraph
    With Customer
        customerBilling.AddText("CUSTOMER BILLING OBJECT PROPERTIES HERE")
    End With
    customerBilling.Format.Alignment = ParagraphAlignment.Left
    sec.Add(customerBilling)

    Dim authorInfo As New Paragraph
    authorInfo.AddText("AUTHOR INFO HERE")
    authorInfo.Format.Alignment = ParagraphAlignment.Right
    sec.Add(authorInfo)

    Dim pricingTable As New Table
    'pricingTable.Format.Alignment = ParagraphAlignment.Center

    pricingTable.AddColumn("13cm")
    pricingTable.AddColumn("13cm")

    Dim headerRow As New Row
    headerRow = pricingTable.AddRow()

    headerRow.HeadingFormat = True
    headerRow.Cells(0).AddParagraph("Description")
    headerRow.Cells(1).AddParagraph("Amount")

    For i As Integer = 0 To SelectedPrices.Count - 1
        Dim row As Row = pricingTable.AddRow()
        Dim price As Pricing = SelectedPrices(i)

        row.Cells(0).AddParagraph(price.Item)
        row.Cells(1).AddParagraph(price.Price * price.Quantity)
    Next

    Dim totalRow As Row = pricingTable.AddRow()
    totalRow.Cells(0).AddParagraph("Total: ")
    Dim total As Double = 0

    For Each price As Pricing In SelectedPrices
        total = total + (price.Price * price.Quantity)
    Next

    totalRow.Cells(1).AddParagraph(total.ToString)

    sec.Add(pricingTable)

    Dim docRenderer As DocumentRenderer = New DocumentRenderer(migraDocument)
    docRenderer.PrepareDocument()

    docRenderer.RenderObject(gfx, XUnit.FromCentimeter(0), XUnit.FromCentimeter(0), "10cm", quotationHeader)
    docRenderer.RenderObject(gfx, XUnit.FromCentimeter(0), XUnit.FromCentimeter(2), "10cm", dhAddressInfo)
    docRenderer.RenderObject(gfx, XUnit.FromCentimeter(5), XUnit.FromCentimeter(2), "10cm", quotationInfo)
    docRenderer.RenderObject(gfx, XUnit.FromCentimeter(0), XUnit.FromCentimeter(6), "10cm", customerBilling)
    docRenderer.RenderObject(gfx, XUnit.FromCentimeter(5), XUnit.FromCentimeter(6), "10cm", authorInfo)
    docRenderer.RenderObject(gfx, XUnit.FromCentimeter(3), XUnit.FromCentimeter(10), "10cm", pricingTable)

    document.Save(Environment.CurrentDirectory & "\test.pdf")
End Sub

请注意,我在底部指定了每个部分的X和Y坐标。我只是想定义间距。对齐应该照顾其余部分。

1 个答案:

答案 0 :(得分:0)

我找到了一个使用PdfDocumentRenderer的不同教程,并展示了如何正确使用它。它不是在VB中,而是很容易翻译。我将它复制到下面以防链接失效。

http://www.c-sharpcorner.com/UploadFile/aftab_ku/create-object-model-document-and-renders-them-into-pdf/

public Document CreateDocument()
{
    // Create a new MigraDoc document
    this.document = new Document();
    this.document.Info.Title = "";
    this.document.Info.Subject = "";
    this.document.Info.Author = "Aftab";

    DefineStyles();
    CreatePage();
    FillContent();
    return this.document;
}

这里,PDFform.cs中的CreateDocument()创建一个新的MigraDoc。看看创建样式和页面所需的三个函数,并填充表格的内容。

//
void DefineStyles()
{
    // Get the predefined style Normal.
    Style style = this.document.Styles["Normal"];

    // Because all styles are derived from Normal, the next line changes the 
    // font of the whole document. Or, more exactly, it changes the font of

    // all styles and paragraphs that do not redefine the font.
    style.Font.Name = "Verdana";

    style = this.document.Styles[StyleNames.Header];
    style.ParagraphFormat.AddTabStop("16cm", TabAlignment.Right); 
    style = this.document.Styles[StyleNames.Footer];
    style.ParagraphFormat.AddTabStop("8cm", TabAlignment.Center); 

    // Create a new style called Table based on style Normal
    style = this.document.Styles.AddStyle("Table", "Normal");
    style.Font.Name = "Verdana";
    style.Font.Name = "Times New Roman";
    style.Font.Size = 9; 

    // Create a new style called Reference based on style Normal
    style = this.document.Styles.AddStyle("Reference", "Normal");
    style.ParagraphFormat.SpaceBefore = "5mm";
    style.ParagraphFormat.SpaceAfter = "5mm";
    style.ParagraphFormat.TabStops.AddTabStop("16cm", TabAlignment.Right);
}

DefineStyles()完成了文档样式的工作:

void CreatePage()
{
    // Each MigraDoc document needs at least one section.
    Section section = this.document.AddSection(); 
    // Put a logo in the header
    Image image= section.AddImage(path); 
    image.Top = ShapePosition.Top;
    image.Left = ShapePosition.Left;
    image.WrapFormat.Style = WrapStyle.Through;

    // Create footer
    Paragraph paragraph = section.Footers.Primary.AddParagraph();
    paragraph.AddText("Health And Social Services.");
    paragraph.Format.Font.Size = 9;
    paragraph.Format.Alignment = ParagraphAlignment.Center; 
    ............

    // Create the item table
    this.table = section.AddTable();
    this.table.Style = "Table";
    this.table.Borders.Color = TableBorder;
    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;
    foreach (DataColumn col in dt.Columns)
    {
        column = this.table.AddColumn(Unit.FromCentimeter(3));
        column.Format.Alignment = ParagraphAlignment.Center;
    } 
    // 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 = TableBlue; 
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        row.Cells[i].AddParagraph(dt.Columns[i].ColumnName);
        row.Cells[i].Format.Font.Bold = false;
        row.Cells[i].Format.Alignment = ParagraphAlignment.Left;
        row.Cells[i].VerticalAlignment = VerticalAlignment.Bottom;
    }

    this.table.SetEdge(0, 0, dt.Columns.Count, 1, Edge.Box, 
         BorderStyle.Single, 0.75, Color.Empty);
}

这里CreatePage()在页面中添加页眉,页脚和不同的部分,然后创建表以显示记录。数据表中的列将添加到文档内的表中,然后添加包含列名称的标题行。

column = this.table.AddColumn(Unit.FromCentimeter(3));
//creates a new column and width of the column is passed as a parameter. 
Row row = table.AddRow();

//A new header row is created   
row.Cells[i].AddParagraph(dt.Columns[i].ColumnName);

//this will add the column name to header of the row. 
this.table.SetEdge(0, 0, dt.Columns.Count, 1, Edge.Box, 
       BorderStyle.Single, 0.75, Color.Empty);
//sets the border of the row

void FillContent()
{
    ............... 
    Row row1;
    for (int i = 0; i < dt.Rows.Count; i++)
    { 
        row1 = this.table.AddRow();
        row1.TopPadding = 1.5;

        for (int j = 0; j < dt.Columns.Count; j++)
        {
            row1.Cells[j].Shading.Color = TableGray;
            row1.Cells[j].VerticalAlignment = VerticalAlignment.Center;

            row1.Cells[j].Format.Alignment = ParagraphAlignment.Left;
            row1.Cells[j].Format.FirstLineIndent = 1;
            row1.Cells[j].AddParagraph(dt.Rows[i][j].ToString());

            this.table.SetEdge(0, this.table.Rows.Count - 2, dt.Columns.Count, 1, 
                 Edge.Box, BorderStyle.Single, 0.75);
        }
    } 
    .............
}   

FillContent()将数据表中的行填充到文档中的表中:

row1.Cells[j].AddParagraph(dt.Rows[i][j].ToString());
//adds the value of column into the table row

Default.aspx文件包含用于生成PDF的代码:

using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using System.Diagnostics;

MigraDoc库用于生成PDF文档,而System.Diagnostics用于启动PDF查看器:

PDFform pdfForm = new PDFform(GetTable(), Server.MapPath("img2.gif"));

// Create a MigraDoc document
Document document = pdfForm.CreateDocument();
document.UseCmykColor = true;

// Create a renderer for PDF that uses Unicode font encoding
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true);

// Set the MigraDoc document
pdfRenderer.Document = document; 

// Create the PDF document
pdfRenderer.RenderDocument();

// Save the PDF document...
string filename = "PatientsDetail.pdf"; 
pdfRenderer.Save(filename);

// ...and start a viewer.
Process.Start(filename);

创建PdfForm对象并使用它,生成一个新的MigraDoc。 PdfDocumentRenderer呈现PDF文档,然后保存它。 Process.Start(filename)启动PDF查看器以打开使用MigraDoc创建的PDF文件。