From e735c66d5c60361da6a53cef35214cad4c4ee5ef Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Fri, 9 Oct 2020 17:08:56 +0200 Subject: [PATCH] Extract metadata tool --- PdfTool/PdfTool.pro | 2 + PdfTool/pdfoutputformatter.cpp | 10 ++++ PdfTool/pdfoutputformatter.h | 3 ++ PdfTool/pdftoolinfometadata.cpp | 82 +++++++++++++++++++++++++++++++++ PdfTool/pdftoolinfometadata.h | 36 +++++++++++++++ 5 files changed, 133 insertions(+) create mode 100644 PdfTool/pdftoolinfometadata.cpp create mode 100644 PdfTool/pdftoolinfometadata.h diff --git a/PdfTool/PdfTool.pro b/PdfTool/PdfTool.pro index ad166f2..d25a8ab 100644 --- a/PdfTool/PdfTool.pro +++ b/PdfTool/PdfTool.pro @@ -45,6 +45,7 @@ SOURCES += \ pdftoolattachments.cpp \ pdftoolinfo.cpp \ pdftoolinfojavascript.cpp \ + pdftoolinfometadata.cpp \ pdftoolinfonameddestinations.cpp \ pdftoolinfopageboxes.cpp \ pdftoolverifysignatures.cpp \ @@ -65,6 +66,7 @@ HEADERS += \ pdftoolattachments.h \ pdftoolinfo.h \ pdftoolinfojavascript.h \ + pdftoolinfometadata.h \ pdftoolinfonameddestinations.h \ pdftoolinfopageboxes.h \ pdftoolverifysignatures.h \ diff --git a/PdfTool/pdfoutputformatter.cpp b/PdfTool/pdfoutputformatter.cpp index 862a44d..abc6a99 100644 --- a/PdfTool/pdfoutputformatter.cpp +++ b/PdfTool/pdfoutputformatter.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -668,4 +669,13 @@ void PDFConsole::writeError(QString text, QString codecName) #endif } +void PDFConsole::writeData(const QByteArray& data) +{ + if (!data.isEmpty()) + { + QTextStream stream(stdout); + stream.device()->write(data); + } +} + } // pdftool diff --git a/PdfTool/pdfoutputformatter.h b/PdfTool/pdfoutputformatter.h index 31ea106..f83f9c0 100644 --- a/PdfTool/pdfoutputformatter.h +++ b/PdfTool/pdfoutputformatter.h @@ -102,6 +102,9 @@ public: /// Writes error to the console static void writeError(QString text, QString codecName); + /// Writes binary data to the console + static void writeData(const QByteArray& data); + private: explicit PDFConsole() = delete; }; diff --git a/PdfTool/pdftoolinfometadata.cpp b/PdfTool/pdftoolinfometadata.cpp new file mode 100644 index 0000000..bb8191e --- /dev/null +++ b/PdfTool/pdftoolinfometadata.cpp @@ -0,0 +1,82 @@ +// Copyright (C) 2020 Jakub Melka +// +// This file is part of PdfForQt. +// +// PdfForQt is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// PdfForQt is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with PDFForQt. If not, see . + +#include "pdftoolinfometadata.h" +#include "pdfexception.h" + +namespace pdftool +{ + +static PDFToolInfoMetadataApplication s_infoMetadataApplication; + +QString PDFToolInfoMetadataApplication::getStandardString(StandardString standardString) const +{ + switch (standardString) + { + case Command: + return "info-metadata"; + + case Name: + return PDFToolTranslationContext::tr("Extract document metadata"); + + case Description: + return PDFToolTranslationContext::tr("Extract document metadata (embedded xml stream)."); + + default: + Q_ASSERT(false); + break; + } + + return QString(); +} + +int PDFToolInfoMetadataApplication::execute(const PDFToolOptions& options) +{ + pdf::PDFDocument document; + QByteArray sourceData; + if (!readDocument(options, document, &sourceData)) + { + return ErrorDocumentReading; + } + + pdf::PDFObject metadata = document.getObject(document.getCatalog()->getMetadata()); + if (metadata.isStream()) + { + try + { + QByteArray rawData = document.getDecodedStream(metadata.getStream()); + PDFConsole::writeData(rawData); + } + catch (pdf::PDFException e) + { + PDFConsole::writeError(e.getMessage(), options.outputCodec); + } + } + else + { + PDFConsole::writeError(PDFToolTranslationContext::tr("Metadata not found in document."), options.outputCodec); + } + + return ExitSuccess; +} + +PDFToolAbstractApplication::Options PDFToolInfoMetadataApplication::getOptionsFlags() const +{ + return ConsoleFormat | OpenDocument; +} + +} // namespace pdftool diff --git a/PdfTool/pdftoolinfometadata.h b/PdfTool/pdftoolinfometadata.h new file mode 100644 index 0000000..fa14a88 --- /dev/null +++ b/PdfTool/pdftoolinfometadata.h @@ -0,0 +1,36 @@ +// Copyright (C) 2020 Jakub Melka +// +// This file is part of PdfForQt. +// +// PdfForQt is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// PdfForQt is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with PDFForQt. If not, see . + +#ifndef PDFTOOLINFOMETADATA_H +#define PDFTOOLINFOMETADATA_H + +#include "pdftoolabstractapplication.h" + +namespace pdftool +{ + +class PDFToolInfoMetadataApplication : public PDFToolAbstractApplication +{ +public: + virtual QString getStandardString(StandardString standardString) const override; + virtual int execute(const PDFToolOptions& options) override; + virtual Options getOptionsFlags() const override; +}; + +} // namespace pdftool + +#endif // PDFTOOLINFOMETADATA_H