Я конвертирую файл .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);
                }

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

2
Jivan Bhandari 19 Дек 2019 в 03:02
Разве программа открытия не удерживает файл? вы уверены в этом?
 – 
Bikram
19 Дек 2019 в 03:11

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

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

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

1
mikenlanggio 19 Дек 2019 в 09:59
Это тот же результат. Когда нет приложения по умолчанию (например, если Internet Explorer является вашим средством просмотра PDF по умолчанию, событие Exited не сработает).
 – 
Bikram
19 Дек 2019 в 09:07
Обновил мои ответы
 – 
mikenlanggio
19 Дек 2019 в 09:59

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

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

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

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

Process.Start(filePath);
-1
n3xus 19 Дек 2019 в 03:18
Я думаю о методе TmpFileCollection, но не знаю, как открыть процесс оттуда.
 – 
Bikram
19 Дек 2019 в 03:13