2016-05-15 66 views
1

我在AIR應用程序中使用xpdf將PDF轉換爲PNG。在轉換之前,我想獲得一個頁面計數,並使用xdf的pdfinfo實用程序打印到stdout,然後解析該字符串以獲取頁面計數。更智能的方法來隔離未格式化的字符串中的值?

我第一遍的解決方案:通過換行符拆分字符串,測試的結果數組「的頁面:」串等

我的解決方案作品,但感覺笨重和脆弱。我想過替換所有的雙重空格,在「:」上做一個分割,然後構建一個哈希表 - 但是在字符串中有冒號的時間戳可能會導致這種情況發生。

有沒有更好或更聰明的方法來做到這一點?

protected function processPDFinfo(data:String):void 
    { 
     var pageCount:Number = 0; 

     var tmp:Array = data.split("\n"); 

     for (var i:int = 0; i < tmp.length; i++){ 
      var tmpStr:String = tmp[i]; 

      if (tmpStr.indexOf("Pages:") != -1){ 
       var tmpSub:Array = tmpStr.split(":"); 
       if (tmpSub.length){ 
        pageCount = Number(tmpSub[tmpSub.length - 1]); 
       } 
       break; 
      } 
     } 

     trace("pageCount", pageCount); 
    } 

Title:   Developing Native Extensions 
Subject:  Adobe Flash Platform 
Author:   Adobe Systems Incorporated 
Creator:  FrameMaker 8.0 
Producer:  Acrobat Distiller Server 8.1.0 
CreationDate: Mon Dec 7 05:45:39 2015 
ModDate:  Mon Dec 7 05:45:39 2015 
Tagged:   yes 
Form:   none 
Pages:   140 
Encrypted:  no 
Page size:  612 x 783 pts (rotated 0 degrees) 
File size:  2505564 bytes 
Optimized:  yes 
PDF version: 1.4 
+0

說到笨拙,爲什麼不在As3中進行pdf解析?如果不在'stdout'上拋出字符串,你首先就不會有問題。 – null

+0

@null - ?我正在使用'xpdf'的'pdftopng'功能。這只是通過'pdfinfo'獲取頁面的數量。但是如果你想分享AS3代碼來解析PDF,我很樂意看看它。 –

回答

1

使用regular expressions這樣一個例子:

/Pages:\s*(\d+)/g 

第一個(也是唯一一個)捕獲組是您正在尋找的數字串。

var pattern:RegExp = /Pages:\s*(\d+)/g; 
var pageCount:int = parseInt(patern.exec(data)[1]); 

據我所知,爲約2%(/頁數:/克)。它正在尋找字符串文字Pages:,然後用spaces wildcardescaping d+

我知道,正則表達式可能很難。真正有助於創建它們的是,如果你的IDE支持它們。也有在線工具,如regexr(我第一次在這裏使用版本2,它甚至比版本1,非常好!)一般來說,你想有一個工具,讓你即時視覺反饋什麼是匹配。

下面是您的文本和我的模式在regexr中的屏幕截圖。

regexr in action

您可以將鼠標懸停在東西和獲得各種信息。 左邊的邊欄是關於正則表達式的完整文檔。

可選解釋選項卡逐步通過給定模式。

\s*是任意數量的空格字符,並且\d+至少是一個數字字符。

並返回一個數組?

這是故事的As3部分。一旦你用他的模式創建了一個RegExp對象,你可以使用exec()在某個String上執行它。(不知道爲什麼他們選擇方法名稱延遲縮寫)

返回值是有點古怪:

返回

對象 - 如果沒有匹配,null;否則,具有以下屬性的對象:

  • (到n 1)的陣列,其中元素0包含完全匹配的字符串,並且陣列的其他元素包含在正則表達式匹配括號組的子字符串
  • index - 字符串(STR)
- 匹配的子串的串
  • input內的字符位置

    你必須檢查exec()的文檔才能真正理解這一點。這是一種JS風格,它將一堆變量放在一起作爲數組的一般對象中。

    這是我示例代碼中的[1]來自的地方。

  • +0

    @ 1202ProgramAlarm對不起,我添加了一些更多的信息 – null

    相關問題