galkahana / HummusJS

Node.js module for high performance creation, modification and parsing of PDF files and streams
http://www.pdfhummus.com
Other
1.14k stars 169 forks source link

Metadata dictionary not saving #237

Open marcelotavares opened 6 years ago

marcelotavares commented 6 years ago

Hi,

I'm writing a lib to read, manipulate and save pdf xmp metadata. But did not find how to write the xml back to pdf. I'm sharing some code bellow, and I'll be glad if you help me with some example...

` export default {

getMetadata(pdfReader) {

    var aDictionary = pdfReader.queryDictionaryObject(pdfReader.getTrailer(),'Root').toPDFDictionary().toJSObject();
    if(aDictionary["Metadata"])
    {
        var metadata = aDictionary["Metadata"];
        var objectID = metadata.toPDFIndirectObjectReference().getObjectID();
        var stream = pdfReader.parseNewObject(objectID);

        var readStream = pdfReader.startReadingFromStream(stream);
        var buf;
        while(readStream.notEnded())
        {
            var bytes = readStream.read(100);
            if(bytes.length>0)
            {
                if(buf)
                    buf = Buffer.concat([buf, new Buffer(bytes)]);
                else
                    buf = new Buffer(bytes);            
            }
        }

        return buf.toString('utf-8');
    }
},

writeMetadata(pdfWriter, metadata) {
    var objectsContext = pdfWriter.getObjectsContext();
    var indirectObject =  objectsContext.startNewIndirectObject();

}

}; `

marcelotavares commented 6 years ago

It's solved using OnCatalogWrite as the example bellow. But I need to create a pull request #239.

`

    const pdfWriter = hummus.createWriterToModify(filename);
    const data = new Buffer(metadata, 'utf-8');
    const parser = pdfWriter.getModifiedFileParser();
    const objectsContext = pdfWriter.getObjectsContext();
    const aDictionary = parser.queryDictionaryObject(parser.getTrailer(),'Root').toPDFDictionary().toJSObject();
    if(aDictionary["Metadata"])
    {
        const objectId = aDictionary["Metadata"].toPDFIndirectObjectReference().getObjectID();
        objectsContext.startModifiedIndirectObject(objectId);    
    }
    else
    {
        const objectId = objectsContext.startNewIndirectObject();
        pdfWriter.requireCatalogUpdate();
        pdfWriter.getEvents().on('OnCatalogWrite',function(dictionaryContext){
            dictionaryContext.catalogDictionaryContext.writeKey('Metadata');
            dictionaryContext.catalogDictionaryContext.writeObjectReferenceValue(objectId);
        });
    }

    const pdfStream = objectsContext.startUnfilteredPDFStream();
    pdfStream.getWriteStream().write([...data]);
    objectsContext.endPDFStream(pdfStream);
    objectsContext.endIndirectObject();
    pdfWriter.end();        

`