Morterset
@Morterset
Программист

Как с помощью php запретить редактировать Docx файл?

Здравствуйте. Есть задача:
На сайте хранятся документы в формате docx, каждый из документов можно редактировать. Можно ли с помощью PHP изменять некоторые документы и запрещать редактирование?
В самом документе это можно сделать отметив документ как окончательный вариант, тем самым запретив редактирование.

P.S.
Варианты с изменением XML структуры файла docx приветствуются.

Заранее благодарен за ответ.

Ответ:
Перелопатив весь docx файл в двух вариантах, обычный и заблокированный, был найден метод блокировки.
Открываем файл как архив и работаем с XML, всё описано внутри каталогов docx.
Файл: [Content_Types].xml
Добавляем запись
<Override PartName="/docProps/custom.xml" ContentType="application/vnd.openxmlformats-officedocument.custom-properties+xml"/>

После записи
<Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/>


Файл: docProps/core.xml
Добавляем запись
<cp:contentStatus>Окончательное</cp:contentStatus>
После
</dcterms:modified>

Файл: _rels/.rels
Заменяем запись
Target="word/document.xml"/></Relationships>
На запись
Target="word/document.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties" Target="docProps/custom.xml"/></Relationships>


Файл: docProps/custom.xml
Создаем файл в каталоге docProps, со следующим содержимым.
<?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="_MarkAsFinal"><vt:bool>true</vt:bool></property></Properties>
  • Вопрос задан
  • 493 просмотра
Решения вопроса 1
Morterset
@Morterset Автор вопроса
Программист
Если кому интересно вот функция со всеми заменами.
function NOEDIT_DOCX($docxFile){ 
		if (!file_exists($docxFile)) {
			die('Файл не найден.');
		}
		 
		$zip = new ZipArchive();
		 
		if (!$zip->open($docxFile)) {
			die('Файл не может быть открыт.');
		}
		 
		//Заменяем все найденные переменные в файле на значения
		$documentXml = $zip->getFromName('[Content_Types].xml');
		$documentXml = str_replace('<Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/>', '<Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/><Override PartName="/docProps/custom.xml" ContentType="application/vnd.openxmlformats-officedocument.custom-properties+xml"/>', $documentXml);	 
		$zip->deleteName('[Content_Types].xml');
		$zip->addFromString('[Content_Types].xml', $documentXml);
		
		
		
		//Заменяем все найденные переменные в файле на значения
		$documentXml = $zip->getFromName('docProps/core.xml');
		$documentXml = str_replace('</dcterms:modified>', '</dcterms:modified><cp:contentStatus>Окончательное</cp:contentStatus>', $documentXml);	 
		$zip->deleteName('docProps/core.xml');
		$zip->addFromString('docProps/core.xml', $documentXml);
	
	
	
		//Заменяем все найденные переменные в файле на значения
		$documentXml = $zip->getFromName('_rels/.rels');
		$documentXml = str_replace('Target="word/document.xml"/></Relationships>', 'Target="word/document.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties" Target="docProps/custom.xml"/></Relationships>', $documentXml);	 
		$zip->deleteName('_rels/.rels');
		$zip->addFromString('_rels/.rels', $documentXml);
		

		$zip->addFile('custom.xml', 'docProps/custom.xml');
		 
		//Закрываем и сохраняем архив
		$zip->close();
	}
	
	
	NOEDIT_DOCX('docx/1.docx');
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы