Как обновить пользовательское свойство файла docx с помощью php

#php

#php

Вопрос:

Я хочу прочитать файл docx и хочу изменить части документа Word (*.docx). Я уже конвертирую docx в zip. Я хочу добавить новые пользовательские свойства (docProps/custom.xml ) в файле docx. Когда я создаю новый файл docx. Я могу добавить пользовательское свойство через php word. Но я хочу прочитать файл docx и обновить пользовательское свойство. Это невозможно с помощью phpword.

Когда я конвертирую docx в zip и открываю docpProps/custom.xml . По умолчанию он предоставлял содержимое XML, как указано ниже:

Текущее содержимое xml:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties
    xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
    xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
    <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="1" name="Property Id">
        <vt:lpwstr>121</vt:lpwstr>
    </property>
</Properties>
  

Я хочу добавить новые свойства и сохранить в zip-файл, как указано ниже

Обновленный контент:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties
    xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
    xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
    <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="1" name="Property Id">
        <vt:lpwstr>121</vt:lpwstr>
    </property>
    <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="Description">
        <vt:lpwstr>Lorem ipsum</vt:lpwstr>
    </property>
    <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="3" name="User Id">
        <vt:lpwstr>12</vt:lpwstr>
    </property>
</Properties>
  

Мой php-код:

         $zip = new ZipArchive;

        // Open this Zip File
        if ($zip->open('helloWorld.docx') == true) {
            // Get custom xml content
            $xmlContent = $zip->getFromName('docProps/custom.xml');

            // I want to update docProps/custom.xml file

            $zip->close();
        }
  

Как это возможно, кто-нибудь знает, пожалуйста, ответьте или дайте мне пример сценария.

Комментарии:

1. Вы смотрели на библиотеку PHPOffice / PHPWord?

2. Да, это невозможно с помощью phpword.

3. Можете ли вы уточнить, какие пользовательские свойства вы хотите добавить? Кроме того, что вы пробовали до сих пор? Как написано в настоящее время, этот вопрос требует более подробной информации.

4. @WOUNDEDStevenJones Я добавил больше деталей, о которых идет речь

5. Подробностей недостаточно. Покажите нам свой php-код, который у вас уже есть, и который терпит неудачу. Мы поможем вам отладить ваш код. Мы не будем это писать.

Ответ №1:

Я смог обновить custom.xml используя приведенный ниже код:

     $zip = new ZipArchive;

    // Open this Zip File
    if ($zip->open('helloWorld.docx') == true) {
        // Get custom xml content
        $xmlContent = $zip->getFromName('docProps/custom.xml');

        // Update docPros/custom.xml content
        $updatedXmlContent = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Properties
            xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
            xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
            <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="Id">
                <vt:lpwstr>121</vt:lpwstr>
            </property>
            <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="3" name="Notes">
                <vt:lpwstr>Lorem ipsum</vt:lpwstr>
            </property>
            <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="4" name="User">
                <vt:lpwstr>12</vt:lpwstr>
            </property>
        </Properties>';

        //Replace the content with the new content created above.
        $zip->addFromString('docProps/custom.xml', $updatedXmlContent);
        $zip->close();
    }
  

Ответ №2:

Файл — это просто XML. Используйте SimpleXML для изменения файла

https://www.php.net/manual/en/simplexml.examples-basic.php