2010-03-17 6 views
0

출력으로 시트 중 하나의 PDF 복사본을 생성해야하는 Excel 통합 문서 솔루션이 있습니다.Excel 2003 VSTO를 PDF로 변환

abcdpdf .net에 대한 라이센스가 있고 html로 출력을 시도한 다음 abcpdf를 사용하여 html을 pdf로 변환했지만 Excel HTML 마크 업은 끔찍한 마크 업으로 4 개의 워크 시트 모두를 에뮬레이트하려고합니다. 또한 색상 (전체 통합 문서의 은색 배경)이 엉망이됩니다.

제안 사항? 내가 abcdpf가 이용 약관을 읽고 동의를 얻을 수, 내가 수동으로 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 파일을 생성하기 위해 사용하고 코드입니다 조금 벗어나고이 솔루션은 최적 이하로 보인다.

미리 감사드립니다.

답변

1

해결 방법 : XPS 인쇄물로 Excel 시트를 저장하십시오. 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();  
     } 
    } 

}