Excel 2003 VSTO转换为PDF

时间:2010-03-17 15:02:30

标签: c# .net excel vsto

我有一个excel工作簿vsto解决方案,需要生成其中一个工作表的pdf副本作为输出。

我有abcdpdf .net的许可证,并尝试输出到html,然后使用abcpdf将html转换为pdf,但excel html标记尝试使用带有可怕标记的所有4个工作表模拟excel。它还会混淆颜色(整个工作簿中的银色背景)。

有什么建议吗?

以下是我目前用于生成html文件的代码:

FileInfo excelDoc = new FileInfo(Globals.ThisWorkbook.Path + @"\Document.html");

Globals.Sheet2.SaveAs(excelDoc.FullName,
    Excel.XlFileFormat.xlHtml, missing, missing, false, false,
    Excel.XlSaveAsAccessMode.xlNoChange,
    missing, missing, missing);

如果我手动删除一些html标头标签,我可以让abcdpf接受它,但格式有点偏,这个解决方案似乎是次优的。

提前致谢。

1 个答案:

答案 0 :(得分:1)

找到解决方案:将excel表存储为XPS打印输出。将XPS打印输出导入pdf文档。

MyImportOperation代码改编自abcpdf XPS示例源代码。

    public void SaveSheetToPdf(FileInfo outputPDF)
    {
        FileInfo documentFile = new FileInfo(Globals.ThisWorkbook.Path + @"\tempDoc.xps");
        if (documentFile.Exists)
            documentFile.Delete();

        Globals.Sheet2.PrintOut(1, missing, 1, false, "Microsoft XPS Document Writer", true, false, documentFile.FullName);

        Doc theDoc = new Doc();                

        try
        {
            MyImportOperation importOp = new MyImportOperation(theDoc);
            importOp.Import(documentFile);            
        }
        catch (Exception ex)
        {
            throw new Exception("Error rendering pdf. PDF Source XPS Path: " + investmentPlanXPSPath, ex);
        }

        theDoc.Save(outputPDF.FullName);
    }

    public class MyImportOperation
    {
       private Doc _doc = null;
       private double _margin = 10;
       private int _pagesAdded = 0;

       public MyImportOperation(Doc doc)
       {
           _doc = doc;
       }

    public void Import(string inPath)
    {
        using (XpsImportOperation op = new XpsImportOperation())
        {
            op.ProcessingObject += Processing;
            op.ProcessedObject += Processed;
            op.Import(_doc, inPath);
        }
    }

    public void Processing(object sender, ProcessingObjectEventArgs e)
    {

        if (e.Info.SourceType == ProcessingSourceType.PageContent)
        {       
            _doc.Page = _doc.AddPage();     
            e.Info.Handled = true;
            _pagesAdded++;
        }
    }

    public void Processed(object sender, ProcessedObjectEventArgs e)
    {
        if (e.Successful)
        {
            PixMap pixmap = e.Object as PixMap;
            if (pixmap != null)
                pixmap.Compress();      
        }
    }

}