PDF 轉存 文字檔的問題 |
缺席
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
基本上我已經完成可以從"讀取PDF檔案"->在PDF檔案中用 "全選/複製" ,將資料複製到記憶體。
再從記憶體中轉存成為TEXT檔案。 三個function分開按下可以完成轉存文字檔的動作。 但是我將三個步驟的function整理成為一個botton以後,發現會出現打開PDF檔案當中,複製跟轉存文字檔的程式都跑完了。 卻沒有完成後面複製跟轉存文字檔的動作。 我希望能夠跑完 PDFOpen(temp); 能夠等PDF開好在進行 PDFAllCopy(0); 再將記憶體資料轉存成為TEXT PDFSaveAs("temp.txt"); 想請問如何讓每一個function執行完畢後才執行下一個(Button2Click)? 以下是我的程式,另外有完整程式上傳,請高手指導我一下,謝謝。 [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "AcroPDFLib_OCX" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- //以下三個程序必須分開執行,混在一起會造成時間上複製不全 void __fastcall TForm1::Button1Click(TObject *Sender) { //開啟PDF檔案 AnsiString temp = "1.pdf"; PDFOpen(temp); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { //全選與複製動作 PDFAllCopy(0); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { //將記憶體的資料複製到Memo中,在儲存成為TXT檔案 PDFSaveAs("temp.txt"); } //--------------------------------------------------------------------------- bool __fastcall TForm1::PDFOpen(AnsiString FileName) { //開啟PDF檔案 AnsiString temp = FileName; wchar_t *pdfFile = new wchar_t[temp.Length() 1]; temp.WideChar(pdfFile, temp.Length() 1); AcroPDF1->LoadFile(pdfFile); AcroPDF1->gotoFirstPage(); delete pdfFile; return 0; } //--------------------------------------------------------------------------- void __fastcall TForm1::PDFAllCopy(TObject *Sender) { //全選與複製動作 AcroPDF1->SetFocus(); //::SetFocus(AcroPDF1->Handle); keybd_event(VK_CONTROL, 0, 0, 0); // 按下 Ctrl keybd_event(65, 0, 0, 0); // 按下 A keybd_event(65, 0, KEYEVENTF_KEYUP, 0); // 放開 A keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // 放開 Ctrl keybd_event(VK_CONTROL, 0, 0, 0); // 按下 Ctrl keybd_event(67, 0, 0, 0); // 按下 C keybd_event(67, 0, KEYEVENTF_KEYUP, 0); // 放開 C keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // 放開 Ctrl } //--------------------------------------------------------------------------- void __fastcall TForm1::PDFSaveAs(AnsiString SaveFileName) { //將記憶體的資料複製到Memo中,在儲存成為TXT檔案 SendMessage(AcroPDF1->Handle,WM_COPY,0,0); TMemo *ed = new TMemo(AcroPDF1); ed->Parent = this; SendMessage(ed->Handle,WM_PASTE,0,0); ed->Lines->SaveToFile(SaveFileName); delete ed; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { //開啟PDF檔案 AnsiString temp = "1.pdf"; PDFOpen(temp); //全選與複製動作 PDFAllCopy(0); //將記憶體的資料複製到Memo中,在儲存成為TXT檔案 PDFSaveAs("temp.txt"); } //--------------------------------------------------------------------------- [/code] |
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
自己找到解決的辦法了
還不錯用,給大家參考 [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Clipbrd.hpp" //引入標頭檔 #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "AcroPDFLib_OCX" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- //以下三個程序必須分開執行,混在一起會造成時間上複製不全 void __fastcall TForm1::Button1Click(TObject *Sender) { //開啟PDF檔案 AnsiString temp = "2.pdf"; PDFOpen(temp); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { //全選與複製動作 PDFAllCopy(0); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { //將記憶體的資料複製到Memo中,在儲存成為TXT檔案 PDFSaveAs("temp.txt"); } //--------------------------------------------------------------------------- void __fastcall TForm1::PDFOpen(AnsiString FileName) { //開啟PDF檔案 AnsiString temp = FileName; wchar_t *pdfFile = new wchar_t[temp.Length() 1]; temp.WideChar(pdfFile, temp.Length() 1); //AcroPDF1->LoadFile(pdfFile); //AcroPDF1->gotoFirstPage(); int iTimeOut = 0; while (AcroPDF1->LoadFile(pdfFile) == false)//判斷PDF是否已經開啟完畢 { //Application->ProcessMessages(); Sleep(100); if (iTimeOut > 100)//逾時 { ShowMessage("開啟PDF檔案發生錯誤!"); break; } iTimeOut ; } delete pdfFile; } //--------------------------------------------------------------------------- void __fastcall TForm1::PDFAllCopy(TObject *Sender) { int iTimeOut = 0; Clipboard()->Clear();//清空剪貼簿 //全選與複製動作 AcroPDF1->SetFocus(); //::SetFocus(AcroPDF1->Handle); keybd_event(VK_CONTROL, 0, 0, 0); // 按下 Ctrl keybd_event(65, 0, 0, 0); // 按下 A keybd_event(65, 0, KEYEVENTF_KEYUP, 0); // 放開 A keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // 放開 Ctrl keybd_event(VK_CONTROL, 0, 0, 0); // 按下 Ctrl keybd_event(67, 0, 0, 0); // 按下 C keybd_event(67, 0, KEYEVENTF_KEYUP, 0); // 放開 C keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // 放開 Ctrl while (Clipboard()->HasFormat(CF_TEXT) == false)//判斷剪貼簿內容是否為文字格式 { Application->ProcessMessages(); Sleep(100); if (iTimeOut > 100)//逾時 { ShowMessage("複製發生錯誤!"); break; } iTimeOut ; } } //--------------------------------------------------------------------------- void __fastcall TForm1::PDFSaveAs(AnsiString SaveFileName) { //將記憶體的資料複製到Memo中,在儲存成為TXT檔案 SendMessage(AcroPDF1->Handle,WM_COPY,0,0); TMemo *ed = new TMemo(AcroPDF1); ed->Parent = this; SendMessage(ed->Handle,WM_PASTE,0,0); ed->Lines->SaveToFile(SaveFileName); delete ed; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { int i=1000; //開啟PDF檔案 AnsiString temp = "2.pdf"; PDFOpen(temp); Sleep(i); //全選與複製動作 PDFAllCopy(0); Sleep(i); //將記憶體的資料複製到Memo中,在儲存成為TXT檔案 PDFSaveAs("temp.txt"); } //--------------------------------------------------------------------------- [/code]
編輯記錄
juneo 重新編輯於 2012-03-18 05:22:19, 註解 無‧
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
[code cpp] //自訂函數:PdfToTextClipboard(SourcePDFPPath,TextPath); //程式功能:可以將PDF檔案轉存成為TEXE (使用AcroPDF1 剪貼簿) void __fastcall TForm1::PdfToTextClipboard(AnsiString SourcePdfPath,AnsiString TextPath) { int i=MyIni->ReadInteger("Config","PDFDelayTime",2000); //開啟PDF檔案 PDFOpen(SourcePdfPath); Sleep(i); //全選與複製動作 //PDFAllCopy(0); int iTimeOut=0; while (PDFAllCopy(0) == false)//判斷複製動作有完成嗎? { Application->ProcessMessages(); Sleep(1000); if (iTimeOut > 10)//逾時 : 等5秒 { //ShowMessage("發生錯誤!"); movefp = 0; break; } iTimeOut ; } Sleep(i); //將記憶體的資料複製到Memo中,在儲存成為TXT檔案 PDFSaveAs(TextPath); Sleep(i); } //--------------------------------------------------------------------------- void __fastcall TForm1::PDFOpen(AnsiString FileName) { //開啟PDF檔案 AnsiString temp = FileName; wchar_t *pdfFile = new wchar_t[temp.Length() 1]; temp.WideChar(pdfFile, temp.Length() 1); //AcroPDF1->LoadFile(pdfFile); //AcroPDF1->gotoFirstPage(); int iTimeOut = 0; while (AcroPDF1->LoadFile(pdfFile) == false)//判斷PDF是否已經開啟完畢 { Application->ProcessMessages(); Sleep(100); if (iTimeOut > 100)//逾時 { //ShowMessage("開啟PDF檔案發生錯誤!"); movefp = 0; break; } iTimeOut ; } delete pdfFile; } //--------------------------------------------------------------------------- bool __fastcall TForm1::PDFAllCopy(TObject *Sender) { int iTimeOut = 0; bool fp=1; Clipboard()->Clear();//清空剪貼簿 //全選與複製動作 AcroPDF1->SetFocus(); //::SetFocus(AcroPDF1->Handle); keybd_event(VK_CONTROL, 0, 0, 0); // 按下 Ctrl keybd_event(65, 0, 0, 0); // 按下 A keybd_event(65, 0, KEYEVENTF_KEYUP, 0); // 放開 A keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // 放開 Ctrl keybd_event(VK_CONTROL, 0, 0, 0); // 按下 Ctrl keybd_event(67, 0, 0, 0); // 按下 C keybd_event(67, 0, KEYEVENTF_KEYUP, 0); // 放開 C keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // 放開 Ctrl while (Clipboard()->HasFormat(CF_TEXT) == false)//判斷剪貼簿內容是否為文字格式 { Application->ProcessMessages(); Sleep(300); if (iTimeOut > 10)//逾時 { //ShowMessage("複製發生錯誤!"); fp=0; break; } iTimeOut ; } return fp; } //--------------------------------------------------------------------------- void __fastcall TForm1::PDFSaveAs(AnsiString SaveFileName) { //將記憶體的資料複製到Memo中,在儲存成為TXT檔案 SendMessage(AcroPDF1->Handle,WM_COPY,0,0); TMemo *ed = new TMemo(AcroPDF1); ed->Parent = this; SendMessage(ed->Handle,WM_PASTE,0,0); ed->Lines->SaveToFile(SaveFileName); delete ed; } //--------------------------------------------------------------------------- //自訂函數:PdfToText(String,String); //程式功能:可以將PDF檔案轉存成為TEXE //cmd : pdf2txt d:\2.pdf d:\testpdf\21.txt or pdftotext 1.pdf void __fastcall TForm1::PdfToText(AnsiString W_Buff) { //使用 ShellExecute 這各外部呼叫的程式 PChar Prog_Path,Web_Path; //將AnsiString字串轉換成為 PChar Web_Path = PAnsiChar(W_Buff.c_str()); AnsiString Path = ExePath "pdf2txt.exe"; //使用相對路徑 //AnsiString Path = MyIni->ReadString("Paths","Program","") "pdf2txt.exe"; //使用相對路徑 Prog_Path = PAnsiChar(Path.c_str()); ShellExecute(0, "open", Prog_Path, Web_Path, NULL, SW_HIDE); //Prog_Path = "pdf2txt.exe"; //if(!FileExists(Prog_Path)) //Prog_Path = "pdf2txt.exe"; // SW_SHOWNORMAL //ShellExecute(0, "open", Prog_Path, Web_Path, NULL, SW_HIDE); //SW_HIDE 隱藏執行視窗 } //--------------------------------------------------------------------------- [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |