获取progressBar以显示PDFTextStripper进度

本文关键字:PDFTextStripper 进度 显示 progressBar 获取 | 更新日期: 2023-09-27 18:24:19

我正在使用Apache PDFBox,在WinForms C#应用程序。

我发现转换大约需要30秒才能完成。我想做的是在C#进度栏中向用户显示转换的进度。

我在程序中添加了一个backgroundWorker线程,以及事件处理程序。然而,当我在backgroundWorker1_DoWork中调用PDFTextStripper时,progressBar不会报告任何进度,直到之后发生转换。(示例代码如下所示)

有人能提出一个更好的方式来展示进展Bar1吗?非常感谢。

将我的.pdf文件复制到它的位置后,我检查文件是否复制成功,然后调用转换方法。

if (File.Exists(@"C:'My PDF Folder'myFile.pdf))
{
    string myFile = @"C:'My PDF Folder'myFile.pdf";
    Tuple<string> tuple = Tuple.Create(myFile);
    backgroundWorker1.RunWorkerAsync(tuple);//convert from .pdf to .txt file.
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i <= 100; i += 20)
    {
        Tuple<string> tupleArgs = (Tuple<string>)e.Argument;
        string myFile = tupleArgs.Item1.ToString();
        string tempText = PDFText(myFile);//The PDFTextStripper method
        //Report the progress
        backgroundWorker1.ReportProgress(i);
        SaveFileDialog sfd = new SaveFileDialog();
        sfd.FileName = @"C:'My PDF Folder'myFile.txt";
        using (Stream s = File.Open(sfd.FileName, FileMode.OpenOrCreate))
        using (StreamWriter sw = new StreamWriter(s))
            sw.Write(tempText);
    }
}
private static String PDFText(String PDFFilePath)
{
    PDDocument doc = PDDocument.load(PDFFilePath);
    PDFTextStripper stripper = new PDFTextStripper();
    string text = stripper.getText(doc);
    doc.close();
    return text;
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //Change the value of the ProgressBar to the BackgroundWorker progress.
    progressBar1.Value = e.ProgressPercentage;
}
public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBar1.Value = 0;
}

获取progressBar以显示PDFTextStripper进度

看起来您已经设置好了。当BackgroundWorker线程中发生了一堆事情时,它仍然发生在单个线程中,一行接一行地执行代码。你不会锁定你的UI线程,这很好,但你仍然需要等待一行代码运行,然后再运行另一行代码。

考虑到您的代码,PDFText()中发生的任何事情都必须在下一行运行并向UI线程报告进度之前完成(ReportProgress()就是这样做的):

string tempText = PDFText(myFile);
backgroundWorker1.ReportProgress(i);

只需翻转两行,就可以在PDFText():中执行长时间运行的操作之前立即报告进度

backgroundWorker1.ReportProgress(i);
string tempText = PDFText(myFile);

另一个观察。。。这里不需要实例化CCD_ 5。只需直接使用文件路径:

using (Stream s = File.Open(@"C:'My PDF Folder'myFile.txt", FileMode.OpenOrCreate))
    using (StreamWriter sw = new StreamWriter(s))
        sw.Write(tempText);

更好,更短:

File.WriteAllText(@"C:'My PDF Folder'myFile.txt", tempText);  // overwrite the file
File.AppendAllText(@"C:'My PDF Folder'myFile.txt", tempText); // or append to the file