С# открыть файл PDF с помощью приложения по умолчанию и удалить файл после закрытия приложения

Я конвертирую файл .txt в pdf, и мне нужно отобразить pdf пользователю. Для этого я создал временный файл .pdf и создал процесс для открытия файла. Это прекрасно работает, когда установлен Adobe Acrobat. Это не удается, когда нет приложения по умолчанию. В моем случае pdf-файл открывается в Internet Explorer, и я получаю исключение Ни один процесс не связан с этим объектом. Есть ли другой способ узнать, когда файл закрывается, чтобы я мог удалить его позже.

Мой код такой.

                HtmlToPdf htmlToPdf = new HtmlToPdf(pdfPrintOptions);

                string tmpFileName = "zx" + DateTime.Now.Ticks + "x.pdf";

                //Iron pdf does not handle in-memory pdf viewing
                //convert it to pdf
                htmlToPdf.RenderHTMLFileAsPdf(fileWithPath).SaveAs(tmpFileName);

                // TempFileCollection tmpFileCollection = new TempFileCollection();
                //Use windows process to open the file
                Process pdfViewerProcess = new Process
                {
                    EnableRaisingEvents = true, StartInfo = {FileName = tmpFileName}
                };
                pdfViewerProcess.Start();

                pdfViewerProcess.WaitForExit(); **Failing in this line**
                //Delete temporary file after the viewing windows is closed
                if (File.Exists(tmpFileName))
                {
                    File.Delete(tmpFileName);
                }

Подобные вопросы, похоже, не дают решения этой проблемы. Любая помощь будет оценена. Спасибо.


person Jivan Bhandari    schedule 19.12.2019    source источник
comment
Разве программа открытия не содержит файл? Ты уверен насчет этого?   -  person Jivan Bhandari    schedule 19.12.2019


Ответы (2)


Вы должны определить tmpFileName в global variable и использовать Event Exited следующим образом:

try{
 Process myProcess = new Process();
 myProcess.StartInfo.FileName = tmpFileName;
 myProcess.EnableRaisingEvents = true;
 myProcess.Exited += new EventHandler(myProcess_Exited);
 myProcess.Start();
}
catch (Exception ex){
 //Handle ERROR
 return;
}


// Method Handle Exited event. 
private void myProcess_Exited(object sender, System.EventArgs e){
 if (File.Exists(tmpFileName))
    {
       File.Delete(tmpFileName);
    }
}

Надеюсь, это поможет вам

Обновите мои ответы: если он все еще не работает. Попробуйте этот ответ

person mikenlanggio    schedule 19.12.2019
comment
Это тот же результат. Когда нет приложения по умолчанию (например, если Internet Explorer является вашим средством просмотра PDF по умолчанию, событие Exited не сработает). - person Jivan Bhandari; 19.12.2019
comment
Обновлены мои ответы - person mikenlanggio; 19.12.2019

Я бы просто сохранил файл PDF в папке TEMP.

Либо в папке TEMP пользователя Windows, либо ваше приложение может создать папку TEMP. Если вы создаете папку TEMP, просто удалите каждый файл, когда ваше приложение закрыто.

string filePath = Path.GetTempPath() + "yourfile.pdf"; 

//Writer your file to Path
//File.WriteAllBytes(filePath, content);

Process.Start(filePath);
person Gubi    schedule 19.12.2019
comment
Я думаю о методе TmpFileCollection, но не знаю, как оттуда открыть процесс. - person Jivan Bhandari; 19.12.2019