首页 > 解决方案 > 在 C# 中预览 PDF

问题描述

我想用 iTextSharp 创建一个 PDF 文档并直接在应用程序中预览它。这不仅是一次,而且在运行时,当用户对文本输入进行更改时,我喜欢经常这样做。

到目前为止它可以工作,但正如我之前所说的,只有一次,当程序启动时。当我尝试再次生成 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 的工具箱中找到了一个页面预览组件,但遗憾的是没有关于如何使用它的参考。使用它可能比使用网络浏览器尝试更容易。

标签: c#itext

解决方案


我的问题是,网络浏览器导航是异步的。作为一种解决方法,当浏览器实际加载文档时,我使用了一个事件监听器来跟踪。

有关该主题的更多信息,请查看此问题:https ://stackoverflow.com/a/583909/12178103

在这里你可以看到我的完整代码

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

推荐阅读