全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2025
推到 Plurk!
推到 Facebook!

PDF 轉存 文字檔的問題

缺席
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-03-04 21:27:08 IP:111.251.xxx.xxx 訂閱
基本上我已經完成可以從"讀取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]

附加檔案:4f536dac4f42f_Test02.rar
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-03-18 19:20:42 IP:111.251.xxx.xxx 訂閱
自己找到解決的辦法了
還不錯用,給大家參考

[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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-03-25 19:16:58 IP:111.243.xxx.xxx 訂閱

[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]

系統時間:2024-05-08 8:11:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!