2014-09-24 36 views
0

我正在使用Apache PDFBox將.pdf文檔轉換爲使用PDFTextStripper的 WinForms C#應用程序中的文本文件。獲取progressBar以顯示PDFTextStripper進度

我發現轉換大約需要30秒才能完成。我想要做的是在C#progressBar中向用戶顯示轉換的進度。

我已經爲程序添加了一個backgroundWorker線程以及事件處理程序。 但是,當我在backgroundWorker1_DoWork中調用PDFTextStripper時,progressBar不會報告任何 進度,直到發生轉換。 (示例代碼如下所示)

任何人都可以提出一個更好的方法來顯示progressBar1中的進度?謝謝。

將我的.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; 
} 

回答

0

看起來你已經設置好了。當你在BackgroundWorker線程中發生了一堆事情時,它仍然發生在一個線程中,一行代碼在另一個線程中。你不會鎖定你的UI線程,這很好,但是你仍然需要等待一行代碼在另一個代碼運行之前運行。

考慮到你的代碼,無論發生的事情在PDFText()必須完成下一行運行,並報告進度回到UI線程(這是什麼ReportProgress()一樣)前:

string tempText = PDFText(myFile); 

backgroundWorker1.ReportProgress(i); 

只需翻轉兩行,讓你馬上在PDFText()做長期運行的東西之前報告進展情況:

backgroundWorker1.ReportProgress(i); 

string tempText = PDFText(myFile); 

另一個觀察結果......這裏沒有必要實例化一個SaveFileDialog。只需直接使用文件路徑:

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 
+0

您好格蘭特。我在轉換之前翻轉了工作人員的ReportProgress並看到一些輕微的視覺改善。 PDFText是Apache PDFBox的文本剝離器,它非常強大。特別是因爲執行轉換需要很長時間,所以我想給用戶一些視覺線索,說明轉換正在幕後進行。不幸的是,用戶在PDF轉換爲文本文件之前仍然不會收到通知。我很欣賞關於使用文件路徑保存文本文件的提示。 – CodeMann 2014-09-24 23:57:12

+0

是的,如果它需要很長時間才能運行,那麼我想你會看到進展的變化,然後一段時間內沒有其他事情會發生。您可能會考慮將ProgressBar上的「樣式」更改爲「選取框」,以便用戶可以指示某事正在發生,然後將百分比顯示在其下的標籤中。 – 2014-09-25 00:24:14

+0

你好格蘭特。這是一個很好的建議,雖然我修改了一下。我離開progressBar樣式爲Block,但添加了一個與ProgressPercentage綁定的標籤,爲用戶提供額外的可視化查詢。我將標籤的文字設置爲顯示百分比。現在,他們可以看到百分比爬升到100%,然後清除。再次感謝。 – CodeMann 2014-09-25 20:45:54