Scriptdd.com

บทความบ้าบ่นของคนทำเว็บ ปี 8

MSWord -> Text file ด้วย Perl + PHP Script

หัวข้อ บทความ แทก How to | Microsoft | Perl | PHP

 แปลกแต่จริง ลูกค้าที่มาให้ผมเขียนงานให้ส่วนใหญ่มักจะเห็นผมเป็นยอดมนุษย์ อยากได้อะไรก็ต้องได้
ผมมักจะได้ไอเดียประหลาดๆ และหาเรื่องมาให้ตัวเองปวดหัวเสมอๆ =___=

ครั้งนี้ก็เหมือนกันมันเคยจากความต้องการของลูกค้าเอง ที่ยังทำงานอยู่กับตระกูล Microsoft Office
เค้าอยากจะนำเอกสารต่างๆที่มีอยู่ ให้สามารถค้นหาผ่าน Web base ได้ โอ้พระเจ้า ไอเดียยอดมากเลยจอร์น ฮา

ปัญหาคือ ค้นหาข้อมูลได้ แล้ว Perl กะ PHP มันจะเข้าไปค้นหายังไงวะ

Perl และ PHP มีคำสั่งค้นหาอยู่ก็จริง แต่เราไม่สามารถ เปิด MSWord มาแล้วทำการใส่คำสั่งค้นหาได้นี่หว่า
นี่คือโจทย์ครับ มาดูการหาคำตอบละกัน


คิดไม่ออก ก็ Google.com
ผมไม่ได้กวนตีนนะ สมาชิกหลายๆคนที่ทักผมมาอาจจะเคยเจอ เล่นตั้งคำถาม ใส่ MSN มาเป็นสิบบรรทัด
ผมมักจะตอบว่า ไม่รู้ ฮาาา ลองไปหาใน Google.com ดูสิ เอิ้กๆ

คราวนี้ก็เหมือนกันครับ ผมก็พาตัวเองเข้าไปใน Google ค้นหาด้วยคำว่า MSword convert to text มั่วส่งไปเรื่อยๆ และผมก็เจอ Web ที่ต้องการ

http://www.winfield.demon.nl/



โจทย์นี้ ลูกค้าต้องการ ค้นหาข้อมูลที่อยู่ใน MSword ได้ แต่ทางแก้ของเราคือ เราต้องแปลง ตัวอักษรต่างๆที่อยู่ใน MSword ออกมา
ให้เป็น Text ธรรม และนำเข้า Perl หรือ PHP ใช้ทำการค้นหาได้

Web นี้ท่าทางมันโกธรแค้นอะไร Microsoft ไม่รู้ อิอิ เค้าเขียน Program เขียน Antiword ออกมา

Antiword เป็น Program นะครับไม่ใช่ Script ที่รันได้บนหลายๆ platform

RISC OS
Linux, Unix (with sources)
BeOS
OS/2
Mac OS X
Amiga
VMS
NetWare
EPOC
Zaurus
DOS
Windows

-___- ตาลายเยอะฉิบ

Antiword จะทำหน้าที่ แปลงข้อมูลtext ต่างๆใน MS word ออกมาเป็น text plain ธรรมดาๆ
ในที่นี้ผมขอละ Version อื่นๆ ทิ้งไปก่อน ขอให้เป็นหน้าที่ Admin ที่แสนดี ของแต่ละ Hosting ที่ใช้ละกัน
ว่าเค้าจะใจดีติดตั้งให้หรือเป่า ผมขออธิบาย การติดตั้งเฉพาะ บน Windows 2000 ละกัน


ติดตั้ง Antiword บน Windows 2000

1. ก็ download Antiword Windows Version ได้ที่
http://www.informatik.uni-frankfurt.de/~markus/antiword/antiword-0_35-windows.zip


2. เสร็จแล้วแตก Zip ออกมาไปกองไว้ที่ c:\antiword เลย (อย่าแรดไป Path อื่นครับมือใหม่เชื่อผมไปก่อนจะได้ไม่มีปัญหา)




3. แก้ไขตัวแปรระบบของ Windows 2000 โดยคลิกขวาที่ไอคอน My Computer เลือก Properties แล้วเลือก Advanced และ
Environment Variables ตามลำดับ



ใน System variables ให้เข้าไป

Path โดยเพิ่มค่า C:\antiword เข้าไปอีกอัน
ANTIWORDHOME เพิ่มค่า C:\antiword
HOME เพิ่มค่า C:\antiword
เสร็จแล้วก็ทำการ Restart เครื่องซะก็ใช้ได้แล้ว

ตรงนี้เป็นเรื่องการกำหนด Path ต่างๆ เพราะ Antiword ถูกเขียนให้ รองรับกับหลายๆ platform ฉะนั้นตรงนี้อาจจะยุ่งยากนิดหน่อย
ใครอยากรู้รายละเอียดมากกว่านี้ หาอ่านเพิ่มเติมได้ที่ C:\antiword\00README.WIN


ลองใช้งานกันก่อน

ผมยังไม่กล่าวถึงการใช้ Perl หรือ PHP เข้าไปคุยละกัน ละไว้ก่อน มาดูการเรียกใช้งานปกติก่อน
ไม่มีอะไรมาก เปิด command ขึ้นแล้ว แล้ว ใส่ command ง่ายๆว่า

antiword nsbasic.doc > nsbasic.txt

ก็คือ ขอทำการ Convert Text ใน nsbasic.doc เป็น nsbasic.txt




ข้อมูลใน MSword เป็นภาษาอังกฤษทั้งหมด



แกะออกมาเป็น Text file แล้วเย้ เอาไปต้มยำทำแกงได้สบายมากแล้ว


และเราก็เอา Perl มาครอบ

หมูตู้แล้วครับ ถ้า Antiword ทำงานบน command แบบนี้ เราก็สามารถเอา Perl มาครอบการทำงานได้ ด้วยคำสั่ง system นั้นเอง

## กำหนดค่า ต่างๆ
$filedoc = 'C:/antiword/nsbasic.doc';
$filetext = 'C:/antiword/nsbasic.txt';
$keyword = 'BMP';

## เรียก system ให้ไปเรียก program antiword
$turn = system("antiword $filedoc > $filetext");


## เปิด text file ที่แปลงออกมา
open(AuM, "$filetext") || die print qq("Error can not open file $file");
while (<AuM>){$datatext.=$_;}
close(AuM);

## ทำการค้นหา
if ($datatext =~/$keyword/i) {
print qq(มีคำว่า $keyword อยู่ใน File $filedoc\n);
}else{
print qq(ค้นหาไม่เจอ\n);
}

exit;

สำหรับ PHP ผมคงไม่โม้ดีกว่า มันไม่ได้ยากเย็นอะไร เพราะใช้คำสั่ง system เหมือนกันทุกประการ (ภาษาพี่ ภาษาน้อง เหมือน ไทยกับลาวไม่มีผิด)
คงพอเขียนกันได้นะครับ (แหะๆ ขี้เกียจโม้เราไปประเด็นอื่นดีกว่า)


นึกว่าจบหรอ ยังยังไม่จบ

ปัญหายังไม่จบครับ พี่ไทยมักมีปัญหากับ Program ประเภทตัวอักษรเสมอ Antiword มันทะเลาะกับภาษาไทยน่ะสิครับ


MSword ที่เป็นภาษาไทย


พอแกะออกมาแล้วเสือกไม่รู้จักภาษาไทย

ผมพยายามหาข้อมูลใน Web แล้ว แต่ก็ไม่ค่อยได้ช่วยอะไรต้องมานั่งลองอ่านคู่มือของ Program และ ตาม Webooard เมืองนอก
ทางออกทางแรก คือ นั่งทำตาราง Unicode ภาษาไทยขึ้นมา -__- ไม่ใช่หมู และผมไม่ค่อยขยันขนาดนั้น

ทางออกที่สอง ทำการแปลงมันเป็น UTF8 ก่อน ด้วยคำสั่ง ว่า

antiword -m UTF-8.txt $filedoc > $filetext

พอใส่ให้มันเป้น UTF8 แล้ว เราก็ค่อยใช้ Perl Script มาแปลง UTF8 ออกมาเป็น Text plain อีกที

ยังอ่านไม่ออกแต่พอแก้ไขได้


Perl Script นี้ได้ ป๋าโป้ Sixhead.com มาเขียนให้ ฮิฮิ ไม่ต้องเหนื่อยแรงผมโมเอา Sub แปลง UTF2TIS ไปใส่

## กำหนดค่า ต่างๆ
$filedoc = 'C:/antiword/test.doc';
$filetext = 'C:/antiword/nsbasic.txt';
$keyword = 'BMP';

## เรียก system ให้ไปเรียก program antiword
#$turn = system("antiword $filedoc > $filetext");
$turn = system("antiword -m UTF-8.txt $filedoc > $filetext");


## เปิด text file ที่แปลงออกมา
open(AuM, "$filetext") || die print qq("Error can not open file $file");
while (<AuM>){$datatext.=$_;}
close(AuM);


$datatext = utf2tis("$datatext");

open(AuM, ">$filetext") || die print qq("Error can not open file $file");
print AuM $datatext;
close(AuM);


## ทำการค้นหา
if ($datatext =~/$keyword/i) {
print qq(มีคำว่า $keyword อยู่ใน File $filedoc\n);
}else{
print qq(ค้นหาไม่เจอ\n);
}

exit;


sub utf2tis {

($utf8) = @_;
$tis = "";
@utf8 = split(//,$utf8);

$last_utf8 = $#utf8;
for ($i=0;$i<=$last_utf8;$i++) {

$temp = ord $utf8[$i];
if($temp > 127) {
if(($temp >= 0xc0) && ($temp <= 0xfd)) { # >= 192 && <=253

$temp2 = ord $utf8[$i+1];
$temp3 = ord $utf8[$i+2];
if(($temp != 224) && (($temp2 < 184) || ($temp2 > 187))) { last; } # not Thai

$temp -= 224; $temp *= 16384;
$temp2 -= 128; $temp2 *= 64;
$temp3 -= 128;

$total = $temp + $temp2 + $temp3;
$total = $total - 0xe00 + 0xa0; # convert UTF -> TIS

$tis .= chr $total; # output ascii equivalent
}
}
else {
$tis .= chr $temp; # standard 7 bit ascii
}
}

return $tis;

}

 

เหมือนเดิมครับ Perl แจกให้แล้ว PHP ไปคิดกันเอง ผมลอง แปลง Script Sub UTF2TIS จาก Perl เป็น PHP แล้ว ไม่ยากครับ อยากให้ลอง
แปลงดู จะได้เก่งๆ ไม่ต้องรอผมป้อนให้ตลอด


แปลง UTFเป็น TEXT แล้ว อ่านได้ ค้นหาได้ตามปกติ


จะจบแล้ว แต่ยังไม่สมบูรณ์

Script นี้ยังไม่ใช่ สมบูรณ์ 100 % นะครับผมไปเจอ Bug ของมันก่อนจะเขียนบทความนี้ไม่กี่ วัน คือ มันมีปัญหากับ MSWord ที่มีเครื่องหมาย " (ฟันหนู)
ใน MSWord ถ้าสังเกตดีๆ ฟันหนูมันจะไม่เหมือนกับใน Editplus ที่เราใช้กัน Bug ของมันคือ ถ้า MSWord มีฟันหูดังกล่าวจะทำให้ Script แปลง UTF
หลุดออกมาจาก Loop ทันที เมื่อแปลงมาถึงฟันหูตัวนั้น

ผมยังหาสาเหตไม่ได้จริงๆ ว่าเพราะอะไร ใครว่างๆ ก็ช่วยไล่ Sub แปลงให้ด้วยจะขอบพระคุณมากครับ

OK บทความนี้ คงจบไว้ที่ ขอบคุณผู้ร่วมสร้างปัญหา คุณลูกค้าที่แสนดีของผม ขอบคุณปีโป้ Sixhead.com มาเขียน Sub UTF2TIS ให้ ขอบคุณคร๊าบบ


27 ธันวาคม Update เพิ่มเติมจากสมาชิก rokoman

และแล้ว สมาชิก Scriptdd ก็มีดีส่งมาให้อิอิ เราไม่ต้องใช้ sub UTF2TIS แล้วครับ น้อง rokoman ไปหา TIS620.txt เพื่อใช้เป็นตารางเทียบ Unicode มาให้แล้ว

คลิกที่นี่

วิธีใช้ก็ไม่ยากครับเปลี่ยนคำสั่งจาก

$turn = system("antiword $filedoc > $filetext");

เป็น

$turn = system("antiword -m tis620.txt $filedoc > $filetext");

ก็เรียบร้อยไม่มีปัญหาเรื่อง " (ฟันหนู) ด้วยครับ ขอบคุณน้อง rokoman ๆ รายนี้เป็น มนุษย์ PHP เฝ้า board อยู่ที่ http://php.deeserver.com นะครับอิอิ

รูปคุณ Read (16,374) Comments (8) 2007-04-12 14:10:15

ความคิดเห็น

กินอะไรเข้าไปกันคับพี่ๆ โครตเก่งเลย ผมละงงตั้งแต่ประโยคแรก

รูปคุณ X โดยคุณ X 2007-06-15 06:33:23

ถ้ามันเป็น word ที่มีหลายภาษาล่ะครับ เราต้องเขียนไฟล์เป็นแบบไฟล์ UTF2TIS ขึ้นมาเองใช่ไหมครับ

รูปคุณ Chumpol โดยคุณ Chumpol 2007-08-06 11:43:26

โห.... พี่ บทความนี้เป็นประโยชน์อย่างมากมาย เพราะตอนนี้กำลังเขียน php ให้ search คำใน file ได้อยู่พอดี กำลังคิดอยู่ว่าจะทำยังไง..... แต่ตอนนี้ ไอเดียบรรเจิดมากมาย ... ขอบคุณมากค่ะ

รูปคุณ อ่อนหัด โดยคุณ อ่อนหัด 2008-04-03 13:44:21

คือ อยากถามว่าถ้าต้องการเอาอัพโหลดไฟล์ขึ้นเซิฟเวอร์ แล้วจาให้แปลงไฟล์จากเวิร์ดเป็น txt จะทำได้รึเปล่า แล้วต้องไปเซ็ตค่อะไรบ้าง ช่วยแนะหน่อบคับ ขอบคุณสำหรับความรุ้ดีดี

รูปคุณ เพียว โดยคุณ เพียว 2009-05-27 11:43:34

พอเอาไปใช้ที่ command แล้ว ทำเสร็จแล้วมันมาแต่ไฟล์.txt พอเปิดไฟล์ตัวหนังสือมันไม่มาด้วย

รูปคุณ enjoy โดยคุณ enjoy 2010-03-30 16:29:17

ผมอยากจะสร้างฐานข้อมูลเพื่อเก็บผลการเรียนแล้วสามารถแสดงบนเว็บได้ต้องทำอย่าไรครับ

รูปคุณ phire โดยคุณ phire 2010-10-28 14:23:37

ขอบคุณมากครับ บทความนี้มีประโยชน์อย่างยิ่ง ตรงกับที่ผมกำลังทำพอดีเลยคับ

รูปคุณ Bank โดยคุณ Bank 2011-09-06 10:08:33

ของผม จะคำถามเดียวกับ คุณ เพียว ครับ

ถ้าเราจะนำขึ้น sever ต้องทำอย่างไรครับ .. ขอบคุณมากๆ ครับ

รูปคุณ beer โดยคุณ beer 2011-12-03 11:56:41

ร่วมแสดงความคิดเห็น



ขอความกรุณา ปัญญาชน ทุกๆท่าน รณรงค์การใช้ภาษาไทยให้ถูกต้อง
กรุณา ลงความคิดเห็นโดยใช้ภาษาไทยให้เป็นภาษาไทย งดการใช้ภาษาวัยรุ่น,
แอ๊บแบ๊ว บอกตรงๆปัญญาอ่อน !! Admin นั่งอ่านแล้วปวดหัว

เข้าระบบ


จำไว้ด้วยนะจ้ะ

สมัครสมาชิก
ลืมรหัสผ่าน

บทความล่าสุด

Gallery

Tags

How to Google Tablet Live Freeware SEO Microsoft Lenovo BarCampBangkok Yamaha เฟรมเสือหมอบ HTML Home Decorate ล้อเสือหมอบ ROM Blog MSN Travel Web2.0 Diary DOM Notebook Plugin Firefox Mobile TV Downloads Book vintage

อื่นๆ ...

เพื่อนบ้าน

สถิติส่วนตัว

คลิกรับ Feed สิจ๊ะ

TwitterCounter for @9aum

Scriptdd.com | ctdd Version 3.0 ติดต่อฐานข้อมูลทิ้งสิ้น 6 ครั้งใช้เวลาประมวลผล 0.0313 วินาที
โปรแกรมโดย 9AuM | ออกแบบโดย styleshout