Предварительный просмотр PDF в C# - PullRequest
1 голос
/ 03 мая 2020

Я бы хотел создать PDF-документ с помощью iTextSharp и предварительно просмотреть его прямо в приложении. И это не только один раз, но так часто, как мне нравится, во время выполнения, когда пользователь вносит изменения в текстовый ввод.

Пока это работает, но, как я уже говорил, только один раз, когда программа запускается , Когда я пытаюсь сгенерировать файл PDF снова, я получаю сообщение об ошибке, что процесс не может получить доступ к сохраненному документу PDF, потому что он в настоящее время используется другим процессом.

Я уже пытался запретить доступ, но пока безуспешно.

    private void CreateDocument()
    {
        //my attempt to stop the browser from blocking the file acces
        if (browser.IsBusy())
        {
            browser.Stop();
        }

        doc = new Document(PageSize.A4);
        writer = PdfWriter.GetInstance(doc, new FileStream("document.pdf", FileMode.Create));

        doc.Open();

        cb = writer.DirectContent;
        //here is the actual pdf generation

        doc.Close();

        //this is the part where I set the pdf document reference from the web browser
        browser.Navigate(@"path\document.pdf");
    }

Фактически ошибка возникает, когда я устанавливаю экземпляр PDFwriter.

Я нашел компонент предварительного просмотра страницы в наборе инструментов из iTextSharp, но, к сожалению, нет ссылки на как это использовать. Использование этого может сработать проще, чем использование веб-браузера.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Моя проблема заключалась в том, что навигация в веб-браузере выполняется асинхронно. В качестве обходного пути я использовал прослушиватель событий, который отслеживает фактическую загрузку документа браузером.

Для получения дополнительной информации об этой топике c проверьте этот вопрос: { ссылка }

Здесь вы можете увидеть мой полный код

//gets called when the application starts
public Form1()
{
    InitializeComponent();

    //first time the web browser load operation gets called - make sure to set the event handler
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowserUnload);
    WebBrowserLoad();          
}

//this button regenerates the pdf
private void Button_Click(object sender, EventArgs e)
{
    WebBrowserLoad();
}

//creates the actually pdf document
private void WebBrowserLoad()
{
    browser.Hide();
    browser.Navigate("about:blank");
}

private void WebBrowserUnload(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.ToString() == "about:blank")
    {
        doc = new Document(PageSize.A4);

        using (fileStream = new FileStream("document\pdf", FileMode.Create))
        {
            using (writer = PdfWriter.GetInstance(doc, fileStream))
            {
                PageEventHelper pageEventHelper = new PageEventHelper();
                writer.PageEvent = pageEventHelper;
                doc.Open();

                cb = writer.DirectContent;

                //create the pdf here

                writer.Flush();

                doc.Close();
                doc.Dispose();
            }

        }

        browser.Navigate(@"path\document.pdf");
    }
    else if (e.Url.ToString() == "file:///path/document.pdf")
    {
        browser.Show();
    }
}
0 голосов
/ 04 мая 2020

Если вы не возражаете против мерцания, просто перейдите к «about: blank», прежде чем пытаться сохранить.

Если у вас есть проблема с этим, просто создайте временную копию файла и откройте копию в браузере. Вероятно, не лучшие решения, но должны работать

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