2009-12-30 111 views
5

在参照先前的帖子(PDF Report generation将HTML转换成PDF

我决定使用类似的解决方案,以http://www.alistapart.com/articles/boom

对于那些你不想读任何参考谁 - 我创建报告并将其作为PDF使用。我决定使用.NET去HTML - > PDF路线。

因此,假设我得到的HTML文件完全像我想要的那样。将所述页面转换为PDF的最佳方式是什么?实质上,我希望用户在HTML中看到“预览”,然后能够将所述页面转换为PDF。我目前正在试验的图书馆是ABCPdf。

我的第一个想法是将页面保存到文件系统,并在页面上的事件处理程序期间在转换例程中引用它的URL。这有问题,因为每次渲染准备打印时都必须保存页面。其实,它似乎只是回传。

我的下一个想法是使用页面的渲染方法来捕获页面作为字节流并使用它(因为ABCPdf支持转换HTML流。)如果这是我的答案,我迷失在如何实际拉它关了。有一个“打印”按钮是处理程序做一个Me.Render()字节流并将其发送到转换例程?这甚至有可能吗?

底线 - 一旦页面以漂亮的HTML呈现,您如何初始化转换为该页面的PDF?变通办法和其他解决方案是受欢迎的。

我希望我失去了一些东西很明显,因为这一定是“容易的部分

+1

另外,我正在将这个页面的HTML模板保存在数据库中,并以编程方式填充数据。这样,我就拥有了HTML,我可以随心所欲地执行任何操作(渲染到屏幕或转换) – IniTech 2009-12-30 18:13:35

回答

3

好吧,让它工作 - 它很简单。只要把它传给下一个可能需要答案的人。我只是使用页面的Url属性并将其发送给ABCPdf addImageUrl()方法。也不得不使用链接,因为它不止一页。感谢所有的帮助。

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() 
-2

如何从C#做呢?你不(直接)。

产生工作者PRINCE.EXE过程可能是您唯一的选择。

PRINCE.EXE将从HTML“标准输入”读取/写入数据并将PDF发送到“标准输出”。使用命令行“%dir%\ PRINCE - ”而不输出文件名。

你可能会发现你需要一个单独的COM组件来产生PRINCE,因为System.Management类可能不适合你。使用Visual Basic或C++来制作COM组件。

将HTML放入数据库通常是一个糟糕的主意,但对您而言可能没问题,因为它听起来像是基本上是静态的。

编辑

改变 “孩子PRINCE.EXE” 到 “工人PRINCE.EXE过程”。我有一个有趣的感觉,PRINCE.EXE需要不是一个子进程。