2015-10-14 2 views
0

Я пытаюсь создать PDF/A-1b в Symfony, используя ZendPDFPHP ZendPDF Изменить Metadata XML

Для этого я должен установить некоторые метаданные в структуре XML в формате PDF. Но я не знаю, как это сделать.

Я попытался изменить XML с помощью DOMDocument, но когда я пытаюсь добавить DOMNode он говорит, что не может написать свойство

$node = new DOMNode(); 
$node->nodeName = "part"; 

Но тогда я Не могу написать свойству Exception

мне просто нужно добавить ребенка на DOMDocument

Полный код

$metadata = $this->pdf->getMetadata(); 

    $metadataDOM = new DOMDocument(); 
    $metadataDOM->loadXML($metadata); 

    $xpath = new DOMXPath($metadataDOM); 
    $xpath->registerNamespace('x', 'adobe:ns:meta/'); 
    $xpath->registerNamespace('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); 
    $xpath->registerNamespace('xmp', 'http://ns.adobe.com/xap/1.0/'); 
    $xpath->registerNamespace('xmpGImg', 'http://ns.adobe.com/xap/1.0/g/img/'); 
    $xpath->registerNamespace('xmpTPg', 'http://ns.adobe.com/xap/1.0/t/pg/'); 
    $xpath->registerNamespace('stDim', 'http://ns.adobe.com/xap/1.0/sType/Dimensions#'); 
    $xpath->registerNamespace('xmpG', 'http://ns.adobe.com/xap/1.0/g/'); 
    $xpath->registerNamespace('dc', 'http://purl.org/dc/elements/1.1/'); 
    $xpath->registerNamespace('xmpMM', 'http://ns.adobe.com/xap/1.0/mm/'); 
    $xpath->registerNamespace('pdf', 'http://ns.adobe.com/pdf/1.3/'); 
    $xpath->registerNamespace('pdfaid', 'http://www.aiim.org/pdfa/ns/id'); 

    $data = $xpath->query('//rdf:Description')->item(0); 

    $node = new DOMNode(); 
    $node->nodeName = "asdf"; 
    $data->appendChild($node); 

    dump($data); 
    dump($metadataDOM->saveXML()); 
    die; 
+0

Вы не можете написать свойство * 'nodeName' *. Поэтому вопрос в том, почему вы пытаетесь это сделать в первую очередь. И то, что вы ожидали, вместо ошибки. И если вы хотите улучшить свой вопрос, уменьшите код до минимума, чтобы создать автономный пример, демонстрирующий вашу проблему. – hakre

ответ

0

Ваша проблема в том, что свойство NODENAME только для чтения смотрите: http://php.net/manual/en/class.domnode.php

определены в классе DOMNode здесь: public readonly string $nodeName;

На ссылке ниже есть также решение с другим элементом, который является только для чтения "TextContent"

http://php.net/manual/en/class.domnode.php#95545

копию решения Дэвид Rekowski Фро м php.net:

Вы не можете просто переписать $ TextContent, чтобы заменить содержимое текста в виде DOMNode, как предполагает недостающее флаг только для чтения. Вместо этого вы должны сделать что-то вроде этого:

<?php 

$node->removeChild($node->firstChild); 
$node->appendChild(new DOMText('new text content')); 

?> 

This example shows what happens: 

<?php 

$doc = DOMDocument::loadXML('<node>old content</node>'); 
$node = $doc->getElementsByTagName('node')->item(0); 
echo "Content 1: ".$node->textContent."\n"; 

$node->textContent = 'new content'; 
echo "Content 2: ".$node->textContent."\n"; 

$newText = new DOMText('new content'); 

$node->appendChild($newText); 
echo "Content 3: ".$node->textContent."\n"; 

$node->removeChild($node->firstChild); 
$node->appendChild($newText); 
echo "Content 4: ".$node->textContent."\n"; 

?> 

The output is: 

Content 1: old content // starting content 
Content 2: old content // trying to replace overwriting $node->textContent 
Content 3: old contentnew content // simply appending the new text node 
Content 4: new content // removing firstchild before appending the new text node 

If you want to have a CDATA section, use this: 

<?php 
$doc = DOMDocument::loadXML('<node>old content</node>'); 
$node = $doc->getElementsByTagName('node')->item(0); 
$node->removeChild($node->firstChild); 
$newText = $doc->createCDATASection('new cdata content'); 
$node->appendChild($newText); 
echo "Content withCDATA: ".$doc->saveXML($node)."\n"; 
?> 

КСТАТИ. этот вопрос вообще не связан с symfony.

0

Проблема решаемая

Я создал базовый PDF PDF/A-1b соответствуют и не должны изменять метаданные больше