пользовательская схема метаданных XMP - PullRequest
0 голосов
/ 01 ноября 2011

Я хочу записать пользовательские метаданные в файл PDF, которые не поддерживаются стандартными схемами XMP, поэтому я написал свою собственную схему, содержащую мои собственные свойства.Я могу успешно записать эти дополнительные пользовательские метаданные в свой файл PDF с помощью библиотеки PDFBox или iTextPDF.Однако я не могу прочитать пользовательские метаданные на стороне клиента без анализа XML-кода XMP.

Я полагаю, что должен быть какой-то API, о котором я не знаю, чтобы вернуть вашу пользовательскую схему обратно в ваш класс Java.

Пожалуйста, помогите мне, если я думаю в правильном направлении или действительнонужно проанализировать xml для получения моих пользовательских данных на стороне клиента?

Вот код, который я написал с использованием библиотеки PDFBox

Файл пользовательских метаданных.

package com.ecomail.emx.core.xmp;

import java.io.IOException;

import org.apache.jempbox.xmp.XMPMetadata;

public class EMXMetadata extends XMPMetadata {

public EMXMetadata() throws IOException {
    super();
}

public EMXSchema addEMXSchema() {
    EMXSchema schema = new EMXSchema(this);
    return (EMXSchema) basicAddSchema(schema);
}

public EMXSchema getEMXSchema() throws IOException {
    return (EMXSchema) getSchemaByClass(EMXSchema.class);
}
}

ПользовательскийФайл схемы.

package com.ecomail.emx.core.xmp;

import java.util.List;

import org.apache.jempbox.xmp.XMPMetadata;
import org.apache.jempbox.xmp.XMPSchema;
import org.w3c.dom.Element;

public class EMXSchema extends XMPSchema {
public static final String NAMESPACE = "http://www.test.com/emx/elements/1.1/";

public EMXSchema(XMPMetadata parent) {
    super(parent, "test", NAMESPACE);
}

public EMXSchema(Element element, String prefix) {
    super(element, prefix);
}

public String getMetaDataType() {
    return getTextProperty(prefix + ":metaDataType");
}

public void setMetaDataType(String metaDataType) {
    setTextProperty(prefix + ":metaDataType", metaDataType);
}

public void removeRecipient(String recipient) {
    removeBagValue(prefix + ":recipient", recipient);
}

public void addRecipient(String recipient) {
    addBagValue(prefix + ":recipient", recipient);
}

public List<String> getRecipients() {
    return getBagList(prefix + ":recipient");
}
}

XML-файл клиента.

package com.ecomail.emx.core.xmp;

import java.util.GregorianCalendar;

import org.apache.jempbox.xmp.XMPMetadata;
import org.apache.jempbox.xmp.XMPSchemaDublinCore;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
import org.apache.pdfbox.pdmodel.common.PDMetadata;

public class XMPClient {

private XMPClient() {
}

public static void main(String[] args) throws Exception {
    PDDocument document = null;

    try {
        document = PDDocument.load("/home/silver/SVNRoot/ecomail/trunk/sample.pdf");
        PDDocumentCatalog catalog = document.getDocumentCatalog();
        PDDocumentInformation info = document.getDocumentInformation();

        EMXMetadata metadata = new EMXMetadata();

        XMPSchemaDublinCore dcSchema = metadata.addDublinCoreSchema();
        dcSchema.setTitle(info.getTitle());
        dcSchema.addContributor("Contributor");
        dcSchema.setCoverage("coverage");
        dcSchema.addCreator("PDFBox");
        dcSchema.addDate(new GregorianCalendar());
        dcSchema.setDescription("description");
        dcSchema.addLanguage("language");
        dcSchema.setCoverage("coverage");
        dcSchema.setFormat("format");

        EMXSchema emxSchema = metadata.addEMXSchema();
        emxSchema.addRecipient("Recipient 1");
        emxSchema.addRecipient("Recipient 2");

        PDMetadata metadataStream = new PDMetadata(document);
        metadataStream.importXMPMetadata(metadata);
        catalog.setMetadata(metadataStream);

        document.save("/home/silver/SVNRoot/ecomail/trunk/sample1.pdf");
        document.close();

        document = PDDocument.load("/home/silver/SVNRoot/ecomail/trunk/sample1.pdf");

        PDDocumentCatalog catalog2 = document.getDocumentCatalog();
        PDMetadata metadataStream2 = catalog2.getMetadata();

        XMPMetadata metadata2 = metadataStream2.exportXMPMetadata();
        EMXSchema emxSchema2 = (EMXSchema) metadata2.getSchemaByClass(EMXSchema.class);
        System.out.println("recipients : " + emxSchema2.getRecipients());
    } finally {
        if (document != null) {
            document.close();
        }
    }
}
 }

В файле XMPClient я ожидаю, что я получу объект EMXSchema обратно из мета-данных, запрашивая его у своего классаназвание.

XMPMetadata metadata2 = metadataStream2.exportXMPMetadata();
EMXSchema emxSchema2 = (EMXSchema) metadata2.getSchemaByClass(EMXSchema.class);
System.out.println("recipients : " + emxSchema2.getRecipients());

Но я получаю исключение нулевого указателя, указывающее, что это не было найдено.Кто-нибудь может помочь мне, если я делаю это правильно или мне нужно проанализировать XMP, чтобы получить значения моих получателей.

Спасибо

1 Ответ

2 голосов
/ 02 ноября 2011

Наконец-то я все заработал сам.Решение состоит в том, чтобы использовать другой конструктор класса XMPMetadata, который принимает предопределенный класс документа.

        document = PDDocument.load("/home/silver/SVNRoot/ecomail/trunk/sample1.pdf");

        PDDocumentCatalog catalog2 = document.getDocumentCatalog();
        PDMetadata metadataStream2 = catalog2.getMetadata();
        System.out.println(metadataStream2.getInputStreamAsString());
        InputStream xmpIn = metadataStream2.createInputStream();

        DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
        f.setExpandEntityReferences(true);
        f.setIgnoringComments(true);
        f.setIgnoringElementContentWhitespace(true);
        f.setValidating(false);
        f.setCoalescing(true);
        f.setNamespaceAware(true);
        DocumentBuilder builder = f.newDocumentBuilder();
        Document xmpDoc = builder.parse(xmpIn);

        EMXMetadata emxMetadata = new EMXMetadata(xmpDoc);
        EMXSchema emxSchema2 = emxMetadata.getEMXSchema();
        System.out.println("recipients : " + emxSchema2.getRecipients());

Теперь мой пользовательский emxMetadata содержит ненулевой объект emxSchema2, и я могу получить от него объекты получателя.Однако, чтобы это работало, мне пришлось изменить EMXMetadata для поддержки XMLNamespaceMapping для вашего класса схемы

public class EMXMetadata extends XMPMetadata {

public EMXMetadata() throws IOException {
    super();
    addXMLNSMapping(EMXSchema.NAMESPACE, EMXSchema.class);
}

public EMXMetadata(Document xmpDoc) {
    super(xmpDoc);
    addXMLNSMapping(EMXSchema.NAMESPACE, EMXSchema.class);
}

public EMXSchema addEMXSchema() {
    EMXSchema schema = new EMXSchema(this);
    return (EMXSchema) basicAddSchema(schema);
}

public EMXSchema getEMXSchema() throws IOException {
    return (EMXSchema) getSchemaByClass(EMXSchema.class);
}

}

...