2011-09-30 59 views
0

我试图通过生成基于HTML的PDF来创建“报告”。HTML to PDF解决方案(处理内容,页眉和页脚)

起初,我只是试图将原始编码的HTML写入文档,然后使用Javascript打印该文档。然而,这让我很少无法控制页眉和页脚。

我试图使用theadtfoot元素,这在大多数浏览器中都能很好地工作,但是我无法获得我正在寻找的格式。

当前 - 我正在尝试在MVC3中使用iTextSharp的服务器端解决方案,但是我对如何继续工作有点遗憾,没有与iTextSharp一起工作过。

输入和输出的描述:

会有在创建报告使用的4个项目:

  • 报告内容(这是目前编码的HTML,因为我不能确定,如果解码将改变任何格式)
  • 报告标题(将简单地t他生成的PDF)的名称
  • 报告标题(将显示在左上角每一页)
  • 报表页脚(将在左下每个页面的显示)

控制器动作:

//This will be accessed by a jQuery Post 
[HttpPost] 
public FileStreamResult GeneratePDF(string id) 
{ 
     //Grab Report Item 
     ReportClass report = reportingAgent.GetReportById(id); 

     Document doc = new Document(); 

     //Do I need to decode the HTML or is it possible to use the encoded HTML? 

     //Adding Headers/Footers 

     //Best method of returning the PDF? 
} 

回答

2

iTextSharp无法将HTML转换为PDF。这不是它设计的目的。它旨在从头开始创建PDF文件,而不是将各种格式转换为PDF。如果您想将HTML转换为PDF,您可以使用基于iTextflying-saucer库。我有blogged关于如何在.NET中使用IKVM.NET Bytecode Compiler (ikvmc.exe)来完成此操作。

所以你的控制器动作看起来可能沿着线:

[HttpPost] 
public FileStreamResult GeneratePDF(string id) 
{ 
    ReportClass report = reportingAgent.GetReportById(id); 
    return PdfResult(report.Html); 
} 

其中PdfResult可能是一个自定义操作结果以原始HTML和PDF输出为响应流:

public class PdfResult : ActionResult 
{ 
    private readonly string _html; 
    public PdfResult(string html) 
    { 
     _html = html; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.ContentType = "application/pdf"; 
     var builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     using (var bais = new ByteArrayInputStream(Encoding.UTF8.GetBytes(_html))) 
     using (var bao = new ByteArrayOutputStream()) 
     { 
      var doc = builder.parse(bais); 
      var renderer = new ITextRenderer(); 
      renderer.setDocument(doc, null); 
      renderer.layout(); 
      renderer.createPDF(bao); 
      var buffer = bao.toByteArray(); 
      response.OutputStream.Write(buffer, 0, buffer.Length); 
     } 
    } 
} 
+0

谢谢达林 - 我会研究飞碟。为工作找到合适的工具总是更好。 –

+0

@Rionmonster,它只是我在生产应用程序中成功使用的一种工具。可能还有其他的替代品,包括商业组件。 –

+0

你有什么工具可以推荐你将飞碟库移植到.NET上(如你的博客中提到的) –