2010-03-17 2 views
0

У меня есть версия excel workbook vsto, которая должна генерировать PDF-копию одного из своих листов в качестве вывода.Excel 2003 VSTO конвертировать в PDF

У меня есть лицензия для abcdpdf .net и пробовал вывод в html, а затем с помощью abcpdf для преобразования html в pdf, но excel html markup пытается эмулировать excel со всеми 4 рабочими листами с ужасной разметкой. Он также смешивает цвета (серебристый фон во всей книге).

Любые предложения?

Вот код, который я сейчас использую для создания 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

Решение найдено: хранить лист 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();  
     } 
    } 

}