summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorSarper Akdemir <sarper.akdemir.extern@allotropia.de>2023-08-19 17:18:50 +0300
committerSarper Akdemir <sarper.akdemir.extern@allotropia.de>2023-09-04 20:54:19 +0200
commit0deea02b1da1001fa497dc5afa5e43207af491d5 (patch)
treef977c1bb9e559a8a44c27173d2488f3eb4305f18 /vcl
parenta45f72b8122d3bb4c0d5ac4252cf7e5a25d52291 (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.hxx9
-rw-r--r--vcl/source/gdi/pdfwriter_impl.cxx28
-rw-r--r--vcl/source/pdf/XmpMetadata.cxx79
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();
}