Excel 2003 VSTO конвертировать в PDF - PullRequest
0 голосов
/ 17 марта 2010

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

У меня есть лицензия на abcdpdf .net, и я попытался вывести ее в html, а затем с помощью abcpdf преобразовал html в pdf, но разметка excel html пытается эмулировать 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 Ответ

1 голос
/ 18 марта 2010

Решение найдено: сохраните лист Excel как распечатку XPS. Импорт распечатки XPS в PDF-документ.

Код MyImportOperation, адаптированный из примера исходного кода XPS abcpdf.

    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();      
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...