解出 pdf 檔案的文字內容

edited 十月 2013 in 進階PHP討論
突然想要把一些 pdf 檔案裡面的文字轉出來,所以找了一下有沒有適合的方案,有找到一個物件:
http://www.phpclasses.org/package/6155-PHP-Extract-text-from-PDF-files.html

雖然失敗,但是跟著作者在程式碼中的註解,找到了 JAVA 的解決方案
http://pdfbox.apache.org/

接著就一直在碰壁、找資料、再試試這個迴圈裡面循環一陣子,總算可以用了 :)

我是在 Ubuntu 12.04.1 操作,首先需要安裝下面三個軟體包:
libcommons-logging-java
libfontbox-java
libpdfbox-java

接著執行這樣的指令:
java -cp /usr/share/java/commons-logging.jar:/usr/share/java/fontbox.jar:/usr/share/java/pdfbox.jar org.apache.pdfbox.PDFBox ExtractText xxx.pdf xxx.txt

會出現這樣的警告:
log4j:WARN No appenders could be found for logger (org.apache.pdfbox.pdmodel.font.PDSimpleFont).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

但是不影響結果, xxx.txt 就是要的文字檔,目前看起來幾個測試的檔案都能夠順利轉換,而且中文也沒問題 ;)

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=7101

評論

  • edited 十二月 2012
    用下面程式碼下載了所有營業登記異動資料清冊,並且嘗試轉換,初步看來效果很不錯,只是還是會有部份缺字變成問號的情況
    <?php
    
    for ($i = 97; $i <= 101; $i++) {
        for ($j = 1; $j <= 12; $j++) {
            if (($i == 97 && $j < 5) || ($i == 101 && $j > 11)) {
                continue;
            }
            $date = str_pad($i, 3, '0', STR_PAD_LEFT) . str_pad($j, 2, '0', STR_PAD_LEFT);
            echo $date . "\n";
            $file = "http://gcis.nat.gov.tw/pub/cmpy/reportAction.do?method=report&reportClass=cmpy&subPath={$date}&fileName={$date}ALS.pdf";
            file_put_contents("tmp/{$date}ALS.pdf", file_get_contents($file));
            exec("java -cp /usr/share/java/commons-logging.jar:/usr/share/java/fontbox.jar:/usr/share/java/pdfbox.jar org.apache.pdfbox.PDFBox ExtractText tmp/{$date}ALS.pdf");
            $file = "http://gcis.nat.gov.tw/pub/cmpy/reportAction.do?method=report&reportClass=cmpy&subPath={$date}&fileName={$date}ALC.pdf";
            file_put_contents("tmp/{$date}ALC.pdf", file_get_contents($file));
            exec("java -cp /usr/share/java/commons-logging.jar:/usr/share/java/fontbox.jar:/usr/share/java/pdfbox.jar org.apache.pdfbox.PDFBox ExtractText tmp/{$date}ALC.pdf");
            $file = "http://gcis.nat.gov.tw/pub/cmpy/reportAction.do?method=report&reportClass=cmpy&subPath={$date}&fileName={$date}ALD.pdf";
            file_put_contents("tmp/{$date}ALD.pdf", file_get_contents($file));
            exec("java -cp /usr/share/java/commons-logging.jar:/usr/share/java/fontbox.jar:/usr/share/java/pdfbox.jar org.apache.pdfbox.PDFBox ExtractText tmp/{$date}ALD.pdf");
        }
    }
    $cities = array(
        '376570000A' => '基隆市政府',
        '376410000A' => '新北市政府',
        '379100000G' => '台北市政府',
        '376430000A' => '桃園縣政府',
        '376440000A' => '新竹縣政府',
        '376580000A' => '新竹市政府',
        '376450000A' => '苗栗縣政府',
        '376460000A' => '台中縣政府',
        '376590000A' => '台中市政府',
        '376480000A' => '南投縣政府',
        '376470000A' => '彰化縣政府',
        '376490000A' => '雲林縣政府',
        '376500000A' => '嘉義縣政府',
        '376600000A' => '嘉義市政府',
        '376510000A' => '台南縣政府',
        '376610000A' => '台南市政府',
        '376520000A' => '高雄縣政府',
        '383100000G' => '高雄市政府',
        '376530000A' => '屏東縣政府',
        '376420000A' => '宜蘭縣政府',
        '376550000A' => '花蓮縣政府',
        '376540000A' => '台東縣政府',
        '376560000A' => '澎湖縣政府',
        '371010000A' => '金門縣政府',
        '371030000A' => '連江縣政府',
    );
    for ($i = 95; $i <= 101; $i++) {
        for ($j = 1; $j <= 12; $j++) {
            if (($i == 95 && $j < 10) || ($i == 101 && $j > 10)) {
                continue;
            }
            $date = str_pad($i, 3, '0', STR_PAD_LEFT) . str_pad($j, 2, '0', STR_PAD_LEFT);
            echo $date . "\n";
            foreach ($cities AS $city => $label) {
                $file = "http://gcis.nat.gov.tw/moeadsBF/cmpy/reportAction.do?method=report&reportClass=bms&subPath={$date}&fileName={$city}setup{$date}.pdf";
                file_put_contents("tmp/{$city}setup{$date}.pdf", file_get_contents($file));
                exec("java -cp /usr/share/java/commons-logging.jar:/usr/share/java/fontbox.jar:/usr/share/java/pdfbox.jar org.apache.pdfbox.PDFBox ExtractText tmp/{$city}setup{$date}.pdf");
                $file = "http://gcis.nat.gov.tw/moeadsBF/cmpy/reportAction.do?method=report&reportClass=bms&subPath={$date}&fileName={$city}change{$date}.pdf";
                file_put_contents("tmp/{$city}change{$date}.pdf", file_get_contents($file));
                exec("java -cp /usr/share/java/commons-logging.jar:/usr/share/java/fontbox.jar:/usr/share/java/pdfbox.jar org.apache.pdfbox.PDFBox ExtractText tmp/{$city}change{$date}.pdf");
                $file = "http://gcis.nat.gov.tw/moeadsBF/cmpy/reportAction.do?method=report&reportClass=bms&subPath={$date}&fileName={$city}rest{$date}.pdf";
                file_put_contents("tmp/{$city}rest{$date}.pdf", file_get_contents($file));
                exec("java -cp /usr/share/java/commons-logging.jar:/usr/share/java/fontbox.jar:/usr/share/java/pdfbox.jar org.apache.pdfbox.PDFBox ExtractText tmp/{$city}rest{$date}.pdf");
            }
        }
    }
    
  • 在另一個專案需求中, yllan 協助透過 scala 呼叫 PDFBox 函式庫的方式,能夠將 pdf 文件中個別文字與座標解析成文字檔案,對於想要將文字排版給程式化的人會有些幫助

    https://github.com/yllan/TextPositionExtractor
Sign In or Register to comment.