Печать листа Excel с использованием оболочки PdfCreator .NET COM - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть небольшой класс, который работает со старыми PDF Creator до версии 2. Он печатает лист Excel в указанный файл PDF, используя принтер PDF Creator, создавая таким образом файл PDF по указанному пути.

public class PDFCreatorHelper
{
    //Global Deceleration        
    private clsPDFCreator  _pdfcreator = null;
    public string CreatedFile { get; private set; }
    public bool ActiveXError { get { return _ActiveXError; } }
    private bool _ActiveXError = false;

    private void _pdfcreator_eError()
    {
        MessageBox.Show("PDF Creator: " + _pdfcreator.cError.Description, "PDF Creator", MessageBoxButton.OK, MessageBoxImage.Error);
    }

    public void Initialize()
    {
        try
        {
            if (_pdfcreator == null)
            {
                _pdfcreator = new clsPDFCreator();
                _pdfcreator.eReady += new __clsPDFCreator_eReadyEventHandler(_pdfcreator_eReady);
                _pdfcreator.eError += new __clsPDFCreator_eErrorEventHandler(_pdfcreator_eError);
            }
        }
        catch (Exception ex)
        {
            _ActiveXError = true;
            Tools.LogException(ex, "PDFCreator");
        }
    }

    private void _pdfcreator_eReady()
    {
        //Returns path for generated PDF File
        CreatedFile = _pdfcreator.cOutputFilename;
    }

    public void PrintSheet(Worksheet xlSheet, Microsoft.Office.Interop.Excel.Application app, string file)
    {
        try
        {
            Initialize();
            if (_ActiveXError) return;

            string parameters = "/NoProcessingAtStartup";

            _pdfcreator = new clsPDFCreator();
            if (!_pdfcreator.cStart(parameters, false))
                MessageBox.Show("Nepodařilo se spustit \"PDFCreator\".", "Tisk sestavy", MessageBoxButton.OK, MessageBoxImage.Error);
            else
            {
                // Set parameters for saving the generating pdf automatically to a directory.
                clsPDFCreatorOptions opt = _pdfcreator.cOptions;
                opt.UseAutosave = 1;// Use auto save functionality.
                opt.UseAutosaveDirectory = 1;// Use directory for saving the file.

                string folder = Path.GetDirectoryName(file);
                string filename = Path.GetFileName(file);
                opt.AutosaveDirectory = folder; // Name of the output directory.
                opt.AutosaveFormat = 0;// Format of file is to be saved. 0 if for pdf.
                opt.AutosaveFilename = filename;// Name of the output file name.

                opt.Papersize = "A4";

                _pdfcreator.cOptions = opt;
                _pdfcreator.cClearCache();

                _pdfcreator.cDefaultPrinter = "PDFCreator";
                string defaultPrinter = _pdfcreator.cDefaultPrinter;                

                xlSheet.PrintOutEx(Type.Missing, Type.Missing, Type.Missing, Type.Missing, "PDFCreator", Type.Missing, Type.Missing, Type.Missing, Type.Missing);

                // Wait till doc gets queued up.
                while (_pdfcreator.cCountOfPrintjobs != 1) ;

                // Start the printer.
                _pdfcreator.cPrinterStop = false;

                // Wait till all doc get converted to pdf.
                while (_pdfcreator.cCountOfPrintjobs != 0) ;

                // Stop the printer.
                _pdfcreator.cPrinterStop = true;

            }
        }
        catch (Exception ex)
        {
            _ActiveXError = true;
            Tools.LogException(ex, "PDFCreator");
        }
        finally
        {
            // Close the printer
            if (_pdfcreator is clsPDFCreator) _pdfcreator.cClose();
             _pdfcreator = null;
        }
    }
}

Но мне нужно добиться того же с новой оболочкой .NET COM . Документация практически отсутствует, а объектная модель совершенно иная. Я не знаю, как запустить PDF Creator, настроить его параметры и печатать в Excel на принтере PDFCreator.

pdfforge.PDFCreator.UI.ComWrapper.PdfCreatorObj o = 
          new pdfforge.PDFCreator.UI.ComWrapper.PdfCreatorObj();
pdfforge.PDFCreator.UI.ComWrapper.Printers p = o.GetPDFCreatorPrinters;
string printerName = o.GetPDFCreatorPrinters.GetPrinterByIndex(0);
...?

(я знаю, что могу сохранить как PDF из Excel, но в нем есть ошибки с определенными шрифтами)

1 Ответ

0 голосов
/ 14 мая 2018

Я нашел пример в папке установки:

C: \ Program Files \ PDFCreator \ Сценарии COM \ C # .Net \ COM_TestForm

Более того, весь проект находится на GitHub с исходным кодом:

https://github.com/pdfforge/PDFCreator

Я изменил свой метод соответственно. Проблема заключалась в том, что мой проект был нацелен на .NET 4.5 и COMWrapper 4.5.1, поэтому при сборке не удалось найти пространство имен pdfcreator. Я скачал PDF Creator из Git и собрал COMWrapper для 4.5, и теперь он работает.

Только есть некоторая ошибка, вызывающая jobQueue.ReleaseCom(), исправляющая повторное использование одной очереди.

public static class PDFCreatorHelper
{
    public static string ErrorText { get; private set; }
    public static string CreatedFile { get; private set; }
    private static pdfforge.PDFCreator.UI.ComWrapper.Queue jobQueue = null;

    public static void PrintSheet(Worksheet xlSheet, Microsoft.Office.Interop.Excel.Application app, string file)
    {
        ErrorText = null;
        CreatedFile = null;
        if (jobQueue == null) 
        {
            Type queueType = Type.GetTypeFromProgID("PDFCreator.JobQueue");
            Activator.CreateInstance(queueType);
            jobQueue = new pdfforge.PDFCreator.UI.ComWrapper.Queue();
            jobQueue.Initialize();  //Reusing one instance for the application runtime
        }
        else
        {
            jobQueue.Clear(); //Delete jobs already put there
        }
        string folder = Path.GetDirectoryName(file);
        string filename = Path.GetFileName(file);
        string convertedFilePath = Path.Combine(folder, filename);

        try
        {
            //Actual print command
            xlSheet.PrintOutEx(Type.Missing, Type.Missing, Type.Missing, Type.Missing, "PDFCreator", Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            if (!jobQueue.WaitForJob(10))
            {
                ErrorText = string.Format("PDFCreator: tisk {0} nebyl spuštěn do 10 sekund.", file);
                Tools.LogError(ErrorText);
            }
            else
            {
                var printJob = jobQueue.NextJob;
                printJob.SetProfileByGuid("DefaultGuid");
                printJob.SetProfileSetting("OpenViewer","false");
                printJob.SetProfileSetting("OpenWithPdfArchitect", "false");
                printJob.SetProfileSetting("ShowProgress", "false");
                printJob.SetProfileSetting("TargetDirectory", folder);
                printJob.SetProfileSetting("ShowAllNotifications", "false");

                if (File.Exists(convertedFilePath)) File.Delete(convertedFilePath);
                printJob.ConvertTo(convertedFilePath);

                if (!printJob.IsFinished || !printJob.IsSuccessful)
                {
                    ErrorText = string.Format("PDFCreator: nepodařila se konverze souboru: {0}.", file);
                    Tools.LogError(ErrorText);
                }
                printJob = null;
            }
        }
        catch (Exception err)
        {
            Tools.LogException(err, "PDFCreator");
            ErrorText = err.Message;
        }
        finally
        {
            CreatedFile = convertedFilePath;
            //If this is left uncommented, app hangs during the second run
            //jobQueue.ReleaseCom(); 
            //jobQueue = null;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...