diff options
author | Sarper Akdemir <sarper.akdemir.extern@allotropia.de> | 2023-08-19 17:18:50 +0300 |
---|---|---|
committer | Sarper Akdemir <sarper.akdemir.extern@allotropia.de> | 2023-09-04 20:54:19 +0200 |
commit | 0deea02b1da1001fa497dc5afa5e43207af491d5 (patch) | |
tree | f977c1bb9e559a8a44c27173d2488f3eb4305f18 /vcl | |
parent | a45f72b8122d3bb4c0d5ac4252cf7e5a25d52291 (diff) |
tdf#138792: PDF export: add batch of dublin core attributes
Adds support for exporting, editing in the UI and storage in
ODF for the dublin core attributes listed below.
Contributor (http://purl.org/dc/elements/1.1/contributor)
Coverage (http://purl.org/dc/elements/1.1/coverage)
Identifier (http://purl.org/dc/elements/1.1/identifier)
Publisher (http://purl.org/dc/elements/1.1/publisher)
Relation (http://purl.org/dc/elements/1.1/relation)
Rights (http://purl.org/dc/elements/1.1/rights)
Source (http://purl.org/dc/elements/1.1/source)
Type (http://purl.org/dc/elements/1.1/type)
Introduces XDocumentProperties2 to extend XDocumentProperties interface.
Change-Id: Ie2e0b1fbbbd00b66aef477ba1bf4e4f61c03a3b3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156330
Tested-by: Jenkins
Reviewed-by: Sarper Akdemir <sarper.akdemir.extern@allotropia.de>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/pdf/XmpMetadata.hxx | 9 | ||||
-rw-r--r-- | vcl/source/gdi/pdfwriter_impl.cxx | 28 | ||||
-rw-r--r-- | vcl/source/pdf/XmpMetadata.cxx | 79 |
3 files changed, 113 insertions, 3 deletions
diff --git a/vcl/inc/pdf/XmpMetadata.hxx b/vcl/inc/pdf/XmpMetadata.hxx index a144266497cf..33fce97a21e3 100644 --- a/vcl/inc/pdf/XmpMetadata.hxx +++ b/vcl/inc/pdf/XmpMetadata.hxx @@ -13,6 +13,7 @@ #include <rtl/string.hxx> #include <tools/stream.hxx> #include <memory> +#include <vector> namespace vcl::pdf { @@ -29,6 +30,14 @@ public: OString msProducer; OString msPDFVersion; OString msKeywords; + std::vector<OString> maContributor; + OString msCoverage; + OString msIdentifier; + std::vector<OString> maPublisher; + std::vector<OString> maRelation; + OString msRights; + OString msSource; + OString msType; OString m_sCreatorTool; OString m_sCreateDate; diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index 00b59830f048..ff2de852f4a8 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -5930,11 +5930,27 @@ static void lcl_assignMeta(std::u16string_view aValue, OString& aMeta) { if (!aValue.empty()) { - OUString aTempString = comphelper::string::encodeForXml(aValue); - aMeta = OUStringToOString(aTempString, RTL_TEXTENCODING_UTF8); + aMeta = OUStringToOString(comphelper::string::encodeForXml(aValue), RTL_TEXTENCODING_UTF8); } } +static void lcl_assignMeta(const css::uno::Sequence<OUString>& rValues, std::vector<OString>& rMeta) +{ + if (!rValues.hasElements()) + return; + + std::vector<OString> aNewMetaVector; + aNewMetaVector.reserve(rValues.getLength()); + + for (const OUString& rValue : rValues) + { + aNewMetaVector.emplace_back( + OUStringToOString(comphelper::string::encodeForXml(rValue), RTL_TEXTENCODING_UTF8)); + } + + rMeta = std::move(aNewMetaVector); +} + // emits the document metadata sal_Int32 PDFWriterImpl::emitDocumentMetadata() { @@ -5963,6 +5979,14 @@ sal_Int32 PDFWriterImpl::emitDocumentMetadata() lcl_assignMeta(m_aContext.DocumentInfo.Producer, aMetadata.msProducer); aMetadata.msPDFVersion = getPDFVersionStr(m_aContext.Version); lcl_assignMeta(m_aContext.DocumentInfo.Keywords, aMetadata.msKeywords); + lcl_assignMeta(m_aContext.DocumentInfo.Contributor, aMetadata.maContributor); + lcl_assignMeta(m_aContext.DocumentInfo.Coverage, aMetadata.msCoverage); + lcl_assignMeta(m_aContext.DocumentInfo.Identifier, aMetadata.msIdentifier); + lcl_assignMeta(m_aContext.DocumentInfo.Publisher, aMetadata.maPublisher); + lcl_assignMeta(m_aContext.DocumentInfo.Relation, aMetadata.maRelation); + lcl_assignMeta(m_aContext.DocumentInfo.Rights, aMetadata.msRights); + lcl_assignMeta(m_aContext.DocumentInfo.Source, aMetadata.msSource); + lcl_assignMeta(m_aContext.DocumentInfo.Type, aMetadata.msType); lcl_assignMeta(m_aContext.DocumentInfo.Creator, aMetadata.m_sCreatorTool); aMetadata.m_sCreateDate = m_aCreationMetaDateString; diff --git a/vcl/source/pdf/XmpMetadata.cxx b/vcl/source/pdf/XmpMetadata.cxx index 6dae3b86ebc1..7496ab26e3f5 100644 --- a/vcl/source/pdf/XmpMetadata.cxx +++ b/vcl/source/pdf/XmpMetadata.cxx @@ -65,7 +65,10 @@ void XmpMetadata::write() } // Dublin Core properties - if (!msTitle.isEmpty() || !msAuthor.isEmpty() || !msSubject.isEmpty()) + if (!msTitle.isEmpty() || !msAuthor.isEmpty() || !msSubject.isEmpty() + || !maContributor.empty() || !msCoverage.isEmpty() || !msIdentifier.isEmpty() + || !maPublisher.empty() || !maRelation.empty() || !msRights.isEmpty() + || !msSource.isEmpty() || !msType.isEmpty()) { aXmlWriter.startElement("rdf:Description"); aXmlWriter.attribute("rdf:about", OString("")); @@ -103,6 +106,80 @@ void XmpMetadata::write() aXmlWriter.endElement(); aXmlWriter.endElement(); } + if (!maContributor.empty()) + { + aXmlWriter.startElement("dc:contributor"); + aXmlWriter.startElement("rdf:Bag"); + for (const OString& rContributor : maContributor) + { + aXmlWriter.startElement("rdf:li"); + aXmlWriter.content(rContributor); + aXmlWriter.endElement(); + } + aXmlWriter.endElement(); + aXmlWriter.endElement(); + } + if (!msCoverage.isEmpty()) + { + aXmlWriter.startElement("dc:coverage"); + aXmlWriter.content(msCoverage); + aXmlWriter.endElement(); + } + if (!msIdentifier.isEmpty()) + { + aXmlWriter.startElement("dc:identifier"); + aXmlWriter.content(msIdentifier); + aXmlWriter.endElement(); + } + if (!maPublisher.empty()) + { + aXmlWriter.startElement("dc:publisher"); + aXmlWriter.startElement("rdf:Bag"); + for (const OString& rPublisher : maPublisher) + { + aXmlWriter.startElement("rdf:li"); + aXmlWriter.content(rPublisher); + aXmlWriter.endElement(); + } + aXmlWriter.endElement(); + aXmlWriter.endElement(); + } + if (!maRelation.empty()) + { + aXmlWriter.startElement("dc:relation"); + aXmlWriter.startElement("rdf:Bag"); + for (const OString& rRelation : maRelation) + { + aXmlWriter.startElement("rdf:li"); + aXmlWriter.content(rRelation); + aXmlWriter.endElement(); + } + aXmlWriter.endElement(); + aXmlWriter.endElement(); + } + if (!msRights.isEmpty()) + { + aXmlWriter.startElement("dc:rights"); + aXmlWriter.startElement("rdf:Alt"); + aXmlWriter.startElement("rdf:li"); + aXmlWriter.attribute("xml:lang", OString("x-default")); + aXmlWriter.content(msRights); + aXmlWriter.endElement(); + aXmlWriter.endElement(); + aXmlWriter.endElement(); + } + if (!msSource.isEmpty()) + { + aXmlWriter.startElement("dc:source"); + aXmlWriter.content(msSource); + aXmlWriter.endElement(); + } + if (!msType.isEmpty()) + { + aXmlWriter.startElement("dc:type"); + aXmlWriter.content(msType); + aXmlWriter.endElement(); + } aXmlWriter.endElement(); } |