2014-01-09 18 views
8

我有一個pdf文件,其中包含表單字段並需要將數據導出到xml文件中AUTOMATICALLY。下面是我爲測試創建了一個示例形式的屏幕:如何將pdf表單字段自動導出到xml

enter image description here

注:它的偉大工程出口它手動使用Acrobat Professional中通過點擊Tools > Form > Export Form Data,最後選擇了文件輸出的XML擴展。這是我手動導出時得到的結果:

<?xml version="1.0" encoding="UTF-8"?> 
<fields> 
    <first_name>John</first_name> 
    <last_name>Doe</last_name> 
</fields> 

但是,我需要自動執行它,與python腳本,Java實現或一些命令行工具。任何想法,我可以用來導出表格字段數據的庫或工具到xml?該工具或庫應該是開源,我可以將它集成到我的工作流程中。

我已經嘗試過蟒蛇pdfminer庫,這讓我導出PDF文件的靜態部分(如Static form headerFirst name:Last name:):但是如何表單字段數據(出口在我的情況下,表單字段first_name的內容和last_name)??

編輯:隨意下載sample.pdf文件here

回答

6

Apache PDFBox怎麼樣?它是開源的,可以滿足您的需求,因爲網站上提到「從PDF表單提取表單數據或預填PDF表單」。

編輯:檢查出PrintFields example

+0

它看起來不錯!我試圖通過命令行提取所有表單域,它的工作原理。我將在明天開始研究Java源代碼示例,但從我看到的正是我所期待的。我會及時通知你的! – Michael

+1

我很高興它有一點幫助。我忘了說'jdom庫'可能是將對象轉換爲xml的好方法。祝你好運! –

+0

很棒!感謝您抽出寶貴的時間 :) – Michael

1

在Java中有幾個庫可以使用PDF,但通常很難從PDF獲取格式化信息。我從來沒有實現過這件事,但Qoppa看起來不錯,似乎是先進的,但它不是免費的。它包含jPDFFields這應該是有用的從表單字段中提取值。 另外還有一個similar thread,其中有一些關於命令行工具的信息。

我希望這會對你有所幫助。

+0

感謝您抽出時間。其實,我一直在尋找一個開源的庫或工具。對不起,我沒有提到它,但。 jPDFFields會完成這項工作。我嘗試了演示applet,它可以工作,因爲我可以將它導出到XML(XFDF)。但是,它不是開源的: -/ – Michael

1

在bash,你可以這樣做(至少在我的版本的這些工具,少444和貓8.13):

less ~/Downloads/sample.pdf | cat 

我得到的輸出將是這樣的:

Static form header 

First name: John 

Last name: Doe 

然後你可以使用Java/Python/awk/whatever顯然解析。當然,或者,如果你不想依賴這些特定版本的行爲(不知道他們是否總是這樣做),你可以查看less's source code看看它是如何做到的。

+0

任何想法如何我會在Windows機器上做到這一點? – Michael

+0

你可以試試cygwin。或者,您可以像我在編輯中添加的那樣查看它本身的效果,並嘗試將該代碼移植到Windows。或者,您可以安裝VMWare,啓動虛擬機,讓虛擬機執行此操作,並將結果返回。或者你可以啓動一個EC2實例,讓EC2實例執行它,然後返回結果。 –

+0

感謝您的想法。我會檢查源代碼,看看我能否適應它。使用VM還不是一種選擇。我寧願選擇在獨立機器上運行的解決方案。 – Michael

1

我使用pdfminer有很大的成功:

pdf2txt.py -o out.xml -t xml sample.pdf 

,然後使用XPath分析它,並加入字符串,用它從你的代碼追蹤代碼here

比,有一個新來的小子等在塊叫tabula,用紅寶石寫的,我沒有得到機會使用,但應該是偉大的

我明白你不願意使用付費服務,但仍值得提及摹已安裝Adobe有一個轉換服務,在寫作的成本2一個月時間,check it out,只是說$ ...

+0

您是否可以使用pdfminer導出表單域?因爲我沒有。我嘗試使用(pdf2text演示頁面)[http://pdf2html.tabesugi.net:8080/]來提取表單字段,但是它僅將導出限制爲靜態字段(如上所述) 。我還沒有做過任何紅寶石,但它可能是一個選擇。我會看看這個。此外,我會在一秒鐘內測試您的命令行代碼片段,以確保我之前使用它時沒有做錯任何事情。 – Michael

+0

AFAIK在pdfminer上沒有Fields的概念,但是你可以用正確的xpaths走很遠 –

+0

如果它值得的話,你能提供一個小例子或鏈接嗎?從我的角度來看,當我的輸出文件(從PDF轉換爲文本)不包含任何表單字段數據時,我無法想象如何使用xpath提取內容。我有這個權利嗎? – Michael

0

對於Java的解決方案,你可以使用iText讀取字段,然後像jackson-dataformat-xml寫結果如XML。一個有點基本的例子是:

// read fields 
final PdfReader reader = new PdfReader("/path/to/my.pdf"); 

final AcroFields fields = reader.getAcroFields(); 
final Map<String, Object> values = new HashMap<>(); 
for (String fieldName : (Set<String>) fields.getFields().keySet()) { 
    values.put(fieldName, fields.getField(fieldName)); 
} 

// write 
final XmlMapper mapper = new XmlMapper(); 
final String result = mapper.writeValueAsString(values); 

System.out.println(result); 

這裏肯定有一些改進的空間,但它可能是一個很好的起點。

+0

iText不是開源的,對吧?至少我沒有看到一個開源庫。如果它不是開源的,這不是一個選項,因爲我只會使用該功能來提取表單字段數據。 – Michael

+1

他們聲稱是開源的,代碼可以在[here](http://sourceforge.net/projects/itext/)找到,並有[可用的兩個許可證](http://itextpdf.com/pricing),商業和AGPL。 – Jonathan

+0

我會仔細檢查,與我們的許可證管理!它可以工作,因爲該項目目前計劃爲一個內部項目。我需要等待執照專家的回答。 – Michael