Search code examples
.nethtmlpdfpdf-generationabcpdf

Convert HTML to PDF


In reference to an earlier post (PDF Report generation)

I have decided to use a solution similar to http://www.alistapart.com/articles/boom

For those of you who don't want to read either reference - I'm creating a report and need it as a PDF. I've decided to go the HTML -> PDF route using .NET.

So, let's say I get the HTML file exactly like I want it. What is the best way to convert said page to PDF? In essence, I'd like the user to see a "preview" in HTML and then be able to convert said page to PDF. The library I'm currently experimenting with is ABCPdf.

My first thought was to save the page to the filesystem and reference it's URL in the conversion routine during an eventhandler on the page itself. This has it's problems because I'd have to save the page each time it was rendered in preparation to print it. Actually, it just seems backasswards.

My next thought was to use the page's render method to capture the page as a bytestream and use this (since ABCPdf supports converting a stream of HTML.) If this is my answer, I'm lost at how to actual pull it off. Have a "Print" button that's handler does a Me.Render() to bytestream and send that to the conversion routine? Is that even possible?

Bottom line - Once a page is rendered in nice HTML, how do you initialize a conversion to PDF of that page? Workarounds and other solutions are welcome.

I'm hoping I'm missing something obvious as this has got to be "the easy part"


Solution

  • Ok, got it working - and it was fairly simple. Just passing this along to the next guy who might need the answer. I just used the Url property of the page and sent it to the ABCPdf addImageUrl() method. Also had to use chaining since it was more than one page. Thanks for all of the help.

    Dim oPdfDoc As New Doc()
    Dim iPageID As Int32
    Dim MyUrl = Request.Url
    
    iPageID = oPdfDoc.AddImageUrl(MyUrl.AbsoluteUri)
    
    While True
        oPdfDoc.FrameRect()
        If Not oPdfDoc.Chainable(iPageID) Then
            Exit While
        End If
        oPdfDoc.Page = oPdfDoc.AddPage()
        iPageID = oPdfDoc.AddImageToChain(iPageID)
    End While
    
    For i as Int32 = 1 To oPdfDoc.PageCount
        oPdfDoc.PageNumber = i
        oPdfDoc.Flatten()
    Next
    
    oPdfDoc.Save(Server.MapPath("test.pdf"))
    oPdfDoc.Clear()