[PHP] docx, xlsx, pptx 텍스트 가져오기

18197 단어 PHPooxmltech
이 글은 GAOGO Advent Calendaar 2021도 GAOGO 축제입니다.의 여섯째 날의 글이다.
어제 보도는[AWS 인정] 솔루션 기술 - 영어 시험(SAA-C02)입니다.

개시하다


안녕하세요.나는 이번 달부터 고베로 이주하기 시작했다.
나는 세계에서 연쇄를 만드는 시동 스튜디오 GAOGO를 소프트웨어 엔지니어로 만들었다.
이 글에는 사무실 시스템의 파일(Word, Excel, PowerPoint)에서 텍스트를 추출한 샘플 코드가 기술되어 있다.
ZipArchive사용류.
다음 프로그램 라이브러리도 있지만 텍스트만 가져오는 데 사용할 좋은 실제 예시를 찾을 수 없습니다. (무시했을 수도 있습니다.)
  • PHPWord
  • PHPSpreadsheet
  • PHPPresentaion
  • 그 전에...

    Office Open XML(OOXML)



    XML의 파일 형식에 따릅니다.
    마이크로소프트 워드, Excel, Powerpoint는 모두 이 파일을 모방한 것이다.
    파일에 있는 문자는 XML 내부에 존재합니다.
    OXML의 실제 상태는 ZIP 아카이브이며 동결해제 후 컨텐트를 확장할 수 있습니다.

    OOXML 내용


    Word(.docx)



    Excel(.xlsx)



    PowerPoint(.pptx)



    설치 예


    운영 환경

  • Mac OS Monterey (12.0.1)
  • PHP 8.0.8
  • Word(docx)의 경우

  • word/document.xml에서 텍스트 가져오기
  • getTextFromDocx.php
    <?php
    
    function getTextFromDocx(string $filePath): string
    {
        $zip = new ZipArchive;
        $result = '';
    
        if ($zip->open($filePath) === true) {
            $documentXml = $zip->getFromName("word/document.xml");
            if ($documentXml) {
                $domDocument = new DOMDocument();
                $domDocument->loadXML($documentXml);
                $paragraphs = $domDocument->getElementsByTagName("p");
                /** @var DOMNode $paragraph */
                foreach ($paragraphs as $paragraph) {
                    $result .= $paragraph->textContent;
                }
            }
        }
    
        return $result . "\n";
    }
    
    echo getTextFromDocx('./test.docx');
    
    

    결실



    Excel(xslx) 시

  • xl/sharedStrings.xml에서 텍스트 가져오기
  • getTextFromXlsx.php
    <?php
    
    function getTextFromXlsx(string $filePath): string
    {
        $zip = new ZipArchive;
        $response = '';
    
        $open = $zip->open($filePath);
        if ($open === true) {
            $sharedStringsXml = $zip->locateName('xl/sharedStrings.xml');
            if ($sharedStringsXml) {
                $domDocument = new DOMDocument;
                $xml = $zip->getFromIndex($sharedStringsXml);
                $domDocument->loadXML($xml, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
                $response .= strip_tags($domDocument->saveXML());
            }
            $zip->close();
        }
    
        return $response;
    }
    
    echo getTextFromXlsx('./test.xlsx');
    

    결실



    PowerPoint(pptx) 시


    getTextFromPptx.php
    <?php
    
    function getTextFromPptx(string $filePath): string
    {
        $zip = new ZipArchive;
        $response = '';
    
        $open = $zip->open($filePath);
    
        if ($open === true) {
            $slideNumber = 1;
            $doc = new DOMDocument;
            while (($xmlIndex = $zip->locateName('ppt/slides/slide' . $slideNumber . '.xml')) !== false) {
                $xmlData   = $zip->getFromIndex($xmlIndex);
                $doc->loadXML($xmlData, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
                $response .= strip_tags($doc->saveXML());
                $slideNumber++;
            }
            $zip->close();
        }
    
        return $response;
    }
    
    echo getTextFromPptx('./test.pptx');
    

    결실



    최후


    이번 샘플 코드는 우리 창고에서 접근할 수 있습니다.
    테스트용 파일도 함께 첨부되어 있기 때문에 명령줄에서 실제로 실행할 수 있다.
    https://github.com/smtrdev/php-ooxml-get-text

    참고 문장

  • Open Office XMl - What is OOXML?
  • Extract text from doc and docx
  • 지금까지 php로 워드(docx)를 읽고plain text를 받았습니다.
  • 좋은 웹페이지 즐겨찾기