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>
  • Вопрос задан
  • 114 просмотров
Решения вопроса 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');
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
ICONIC Москва
от 180 000 до 300 000 руб.
от 90 000 до 140 000 руб.
Aitarget Москва
от 100 000 руб.