簡體   English   中英

從PDF中提取文本

[英]Extracting text from PDF

我試圖使用此處的代碼從PDF文件中提取文本。 該代碼使用zlib庫。

AFAICT程序的工作原理是在pdf文件中找到文本“stream”和“endstream”的出現之間的內存塊。 然后通過zlib對這些塊進行充氣。

代碼在一個示例pdf文檔上完美運行,但在另一個示例中,zlib的inflate inflate()函數每次調用時都會返回-3(Z_DATA_ERROR)。

我注意到,失敗的pdf文件被設置為在Adobe Reader中打開時沒有“復制”選項。 這可能與inflate()錯誤有關嗎?...如果是,是否有解決問題的辦法?

下面的代碼片段 - 請參閱注釋

            //Now use zlib to inflate:
            z_stream zstrm; ZeroMemory(&zstrm, sizeof(zstrm));

            zstrm.avail_in = streamend - streamstart + 1;
            zstrm.avail_out = outsize;
            zstrm.next_in = (Bytef*)(buffer + streamstart);
            zstrm.next_out = (Bytef*)output;

            int rsti = inflateInit(&zstrm);
            if (rsti == Z_OK)
            {
                int rst2 = inflate (&zstrm, Z_FINISH); // HERE IT RETURNS -3
                if (rst2 >= 0)
                {
                    //Ok, got something, extract the text:
                    size_t totout = zstrm.total_out;
                    ProcessOutput(fileo, output, totout);
                }
            }

編輯:我通過名為zamzar的在線pdf到文本轉換器測試了“加密”pdf中的文本提取,結果文本文件非常完美。 所以要么zamzar有一些超級解密系統......或者也許它不是很難。

編輯:剛剛發現A-pdf也沒有問題轉換為文本。

PDF中的流不需要用flate編碼。 它們可以編碼為:

  1. 沒有
  2. LZW
  3. Flate
  4. ASCII85
  5. Crypt(可能是幾種不同算法之一)

而且(驚喜,驚喜)這些方法中的任何一種都可以疊加在一起!

如果沒有復制選項,則可能使用所有者密碼和用戶密碼進行加密。 這允許作者創建應該由讀者尊重的訪問權限,包括:

  1. 修改文檔內容
  2. 復制文本/圖形
  3. 添加/編輯注釋
  4. 印花
  5. 填表
  6. 組裝文檔(插入,刪除頁面,創建書簽,縮略圖)
  7. 高/低質量打印

這種從PDF中獲取文本的特殊方法充滿了錯誤,我可以為您提供一組文檔,由於字體重新編碼,分割文本,奇怪的位置,您將無法使用這些文檔,形成XObjects,異常轉換等。

要正確執行此操作,您需要一組更好的工具,這些工具不會對PDF文檔的實際格式和結構視而不見。 iText會這樣做,DotImage會這樣做。

為了讓您了解問題的范圍,我在Acrobat 1.0中編寫了原始文本搜索代碼,並且使用了所有可用的內部工具,我花了好幾個月的時間來完成它並且代碼包括查找文本的能力在不尋常的非直線方向(思考地圖),處理連字,重新編碼,非羅馬字體等。 當我正在編寫代碼的時候,還有另一位工程師專門花了幾年的時間編寫一個名為Wordy的代碼,為全文提取和索引編寫類似的東西(但更復雜)(有關Wordy的更多信息,請參閱此答案 ) 。

如果沒有“復制”選項,則pdf被加密,流也是如此。 普通的zlib不起作用,你必須首先解密pdf,現在你正在使用一個合適的庫來提取文本,有很多編碼需要注意,並不是所有的都是win ansi。

這是可能的,因為標題與文檔的不同之處在於,為此,請參閱ZLib Inflate()與-3 Z_DATA_ERROR失敗的相關問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM