c# - 在 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 的工具箱中找到了一个页面预览组件,但遗憾的是没有关于如何使用它的参考。使用它可能比使用网络浏览器尝试更容易。
解决方案
我的问题是,网络浏览器导航是异步的。作为一种解决方法,当浏览器实际加载文档时,我使用了一个事件监听器来跟踪。
有关该主题的更多信息,请查看此问题: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();
}
}
推荐阅读
- flutter - 如何模糊 Flutter 中的 BottomNavigationBar?
- spring - Junit:状态预期 <200> 但它是 <400>
- javascript - 如何在 Object 中使用可以正确渲染的 snapshotChanges()?
- file - withFile 提前关闭文件
- node.js - heroku 中的“未为 webpack-dev-server 启用 HMR”错误
- javascript - Three.js:动画 gltf 模型在 three.js 中看起来不连贯
- reactjs - 如果 this.node 是反应组件的 ref,则 this.node.contains 不起作用
- c# - 我不明白这个错误..我认为据我所知有一个数据类型,但我不明白怎么做?
- c# - JsonConvert 仅反序列化类字段
- python - 每次运行时都在新行上打印?