Самый простой способ извлечь изображения из документа MS Word с помощью PHP? - PullRequest
2 голосов
/ 18 марта 2012

Возможно ли извлечь изображения из документов MS Word с помощью PHP? И если да, то как?

Требование: определенно поддержка документооборота old-shool, но желательно как старая, так и новая.

Ответы [ 4 ]

5 голосов
/ 18 марта 2012

Создайте новый файл PHP, назовите его extract.php и добавьте в него следующий код.

<?php

/*Name of the document file*/
$document = 'attractive_prices.docx';

/*Function to extract images*/ 
function readZippedImages($filename) {


/*Create a new ZIP archive object*/
    $zip = new ZipArchive;

    /*Open the received archive file*/
    if (true === $zip->open($filename)) {
        for ($i=0; $i<$zip->numFiles;$i++) {


/*Loop via all the files to check for image files*/
            $zip_element = $zip->statIndex($i);


/*Check for images*/
            if(preg_match("([^\s]+(\.(?i)(jpg|jpeg|png|gif|bmp))$)",$zip_element['name'])) {


/*Display images if present by using display.php*/
                echo "<image src='display.php?filename=".$filename."&index=".$i."' /><hr />";
            }
        }
    }
}
readZippedImages($document);
?>

Теперь создайте еще один PHP-файл и назовите его display.php и добавьте в него следующий код.

<?php


/*Tell the browser that we want to display an image*/
    header('Content-Type: image/jpeg');


/*Create a new ZIP archive object*/
    $zip = new ZipArchive;

    /*Open the received archive file*/
    if (true === $zip->open($_GET['filename'])) {


/*Get the content of the specified index of ZIP archive*/
        echo $zip->getFromIndex($_GET['index']);
    }

    $zip->close();
?>

Источник (и): Извлечение изображений из DocX с использованием PHP

1 голос
/ 18 марта 2012

Если вы извлекаете изображения из старых файлов, у вас есть несколько вариантов.

Запустите конвертер для обновления всех файлов до DocX, затем используйте код IntermediateHacker.

Найдите код VBA, необходимый для извлечения изображений, а затем либо создайте макрос и вызовите этот код через функции интерфейса COM в PHP, либо вызовите код самостоятельно через эти функции.

Первое, что нужно сделать, это найти, как это сделать в VBA, это облегчит работу в PHP.

0 голосов
/ 05 апреля 2019

Надеюсь, что это поможет Вам, и вы также можете отформатировать в соответствии с вашими потребностями.

<?php
/**  
 * Created by PhpStorm.
 * User: khalid
 * Date: 04/26/2015
 * Time: 10:32 AM
 */
class DocxImages {
private $file;
private $indexes = [ ];
/** Local directory name where images will be saved */
private $savepath = 'docimages';
public function __construct( $filePath ) {
    $this->file = $filePath;
    $this->extractImages();
}
function extractImages() {
    $ZipArchive = new ZipArchive;
    if ( true === $ZipArchive->open( $this->file ) ) {
        for ( $i = 0; $i < $ZipArchive->numFiles; $i ++ ) {
            $zip_element = $ZipArchive->statIndex( $i );
            if ( preg_match( "([^\s]+(\.(?i)(jpg|jpeg|png|gif|bmp))$)", $zip_element['name'] ) ) {
                $imagename                   = explode( '/', $zip_element['name'] );
                $imagename                   = end( $imagename );
                $this->indexes[ $imagename ] = $i;
            }
        }
    }
}
function saveAllImages() {
    if ( count( $this->indexes ) == 0 ) {
        echo 'No images found';
    }
    foreach ( $this->indexes as $key => $index ) {
        $zip = new ZipArchive;
        if ( true === $zip->open( $this->file ) ) {
            file_put_contents( dirname( __FILE__ ) . '/' . $this->savepath . '/' .    $key, $zip->getFromIndex( $index ) );
        }
        $zip->close();
    }
}
function displayImages() {
    $this->saveAllImages();
    if ( count( $this->indexes ) == 0 ) {
        return 'No images found';
    }
    $images = '';
    foreach ( $this->indexes as $key => $index ) {
        $path = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $this->savepath . '/' . $key;
        $images .= '<img src="' . $path . '" alt="' . $key . '"/> <br>';
    }
    echo $images;
 }
}
$DocxImages = new DocxImages( "doc.docx" );
/** It will save and display images*/
$DocxImages->displayImages();
/** It will only save images to local server */
#$DocxImages->saveAllImages();
?>
0 голосов
/ 18 марта 2012

Если вы используете более новый формат docx, этого легко достичь, поскольку они представляют собой не более чем zip-файл. Смотрите следующую ссылку:

http://www.botskool.com/geeks/how-extract-images-docx-files-using-php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...