mirror of
				https://github.com/JakubMelka/PDF4QT.git
				synced 2025-06-05 21:59:17 +02:00 
			
		
		
		
	Info tool about page boxes
This commit is contained in:
		| @@ -284,6 +284,12 @@ void PDFClosedIntervalSet::addInterval(PDFInteger low, PDFInteger high) | |||||||
|     normalize(); |     normalize(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void PDFClosedIntervalSet::merge(const PDFClosedIntervalSet& other) | ||||||
|  | { | ||||||
|  |     m_intervals.insert(m_intervals.end(), other.m_intervals.cbegin(), other.m_intervals.cend()); | ||||||
|  |     normalize(); | ||||||
|  | } | ||||||
|  |  | ||||||
| bool PDFClosedIntervalSet::isCovered(PDFInteger low, PDFInteger high) | bool PDFClosedIntervalSet::isCovered(PDFInteger low, PDFInteger high) | ||||||
| { | { | ||||||
|     PDFClosedIntervalSet temporary; |     PDFClosedIntervalSet temporary; | ||||||
|   | |||||||
| @@ -604,6 +604,9 @@ public: | |||||||
|     /// \param value Value |     /// \param value Value | ||||||
|     void addValue(PDFInteger value) { addInterval(value, value); } |     void addValue(PDFInteger value) { addInterval(value, value); } | ||||||
|  |  | ||||||
|  |     /// Merge with other interval set | ||||||
|  |     void merge(const PDFClosedIntervalSet& other); | ||||||
|  |  | ||||||
|     /// Returns true, if given closed range is subset of |     /// Returns true, if given closed range is subset of | ||||||
|     /// this interval set. |     /// this interval set. | ||||||
|     bool isCovered(PDFInteger low, PDFInteger high); |     bool isCovered(PDFInteger low, PDFInteger high); | ||||||
|   | |||||||
| @@ -46,6 +46,7 @@ SOURCES += \ | |||||||
|         pdftoolinfo.cpp \ |         pdftoolinfo.cpp \ | ||||||
|         pdftoolinfojavascript.cpp \ |         pdftoolinfojavascript.cpp \ | ||||||
|         pdftoolinfonameddestinations.cpp \ |         pdftoolinfonameddestinations.cpp \ | ||||||
|  |         pdftoolinfopageboxes.cpp \ | ||||||
|         pdftoolverifysignatures.cpp \ |         pdftoolverifysignatures.cpp \ | ||||||
|         pdftoolxml.cpp |         pdftoolxml.cpp | ||||||
|  |  | ||||||
| @@ -65,5 +66,6 @@ HEADERS += \ | |||||||
|     pdftoolinfo.h \ |     pdftoolinfo.h \ | ||||||
|     pdftoolinfojavascript.h \ |     pdftoolinfojavascript.h \ | ||||||
|     pdftoolinfonameddestinations.h \ |     pdftoolinfonameddestinations.h \ | ||||||
|  |     pdftoolinfopageboxes.h \ | ||||||
|     pdftoolverifysignatures.h \ |     pdftoolverifysignatures.h \ | ||||||
|     pdftoolxml.h |     pdftoolxml.h | ||||||
|   | |||||||
							
								
								
									
										160
									
								
								PdfTool/pdftoolinfopageboxes.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								PdfTool/pdftoolinfopageboxes.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | //    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 <https://www.gnu.org/licenses/>. | ||||||
|  |  | ||||||
|  | #include "pdftoolinfopageboxes.h" | ||||||
|  | #include "pdfutils.h" | ||||||
|  |  | ||||||
|  | namespace pdftool | ||||||
|  | { | ||||||
|  |  | ||||||
|  | static PDFToolInfoPageBoxesApplication s_infoPageBoxesApplication; | ||||||
|  |  | ||||||
|  | QString PDFToolInfoPageBoxesApplication::getStandardString(StandardString standardString) const | ||||||
|  | { | ||||||
|  |     switch (standardString) | ||||||
|  |     { | ||||||
|  |         case Command: | ||||||
|  |             return "info-page-boxes"; | ||||||
|  |  | ||||||
|  |         case Name: | ||||||
|  |             return PDFToolTranslationContext::tr("Info (page boxes)"); | ||||||
|  |  | ||||||
|  |         case Description: | ||||||
|  |             return PDFToolTranslationContext::tr("Retrieve informations about page boxes in a document."); | ||||||
|  |  | ||||||
|  |         default: | ||||||
|  |             Q_ASSERT(false); | ||||||
|  |             break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return QString(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | struct PDFPageBoxInfo | ||||||
|  | { | ||||||
|  |     bool operator==(const PDFPageBoxInfo& other) const | ||||||
|  |     { | ||||||
|  |         return mediaBox == other.mediaBox && | ||||||
|  |                 cropBox == other.cropBox && | ||||||
|  |                 bleedBox == other.bleedBox && | ||||||
|  |                 trimBox == other.trimBox && | ||||||
|  |                 artBox == other.artBox; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     pdf::PDFClosedIntervalSet pages; | ||||||
|  |     QRectF mediaBox; | ||||||
|  |     QRectF cropBox; | ||||||
|  |     QRectF bleedBox; | ||||||
|  |     QRectF trimBox; | ||||||
|  |     QRectF artBox; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int PDFToolInfoPageBoxesApplication::execute(const PDFToolOptions& options) | ||||||
|  | { | ||||||
|  |     pdf::PDFDocument document; | ||||||
|  |     QByteArray sourceData; | ||||||
|  |     if (!readDocument(options, document, &sourceData)) | ||||||
|  |     { | ||||||
|  |         return ErrorDocumentReading; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     QString parseError; | ||||||
|  |     std::vector<pdf::PDFInteger> pages = options.getPageRange(document.getCatalog()->getPageCount(), parseError, true); | ||||||
|  |  | ||||||
|  |     if (!parseError.isEmpty()) | ||||||
|  |     { | ||||||
|  |         PDFConsole::writeError(parseError, options.outputCodec); | ||||||
|  |         return ErrorInvalidArguments; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     std::vector<PDFPageBoxInfo> infos; | ||||||
|  |     for (const pdf::PDFInteger pageIndex : pages) | ||||||
|  |     { | ||||||
|  |         const pdf::PDFPage* page = document.getCatalog()->getPage(pageIndex); | ||||||
|  |  | ||||||
|  |         PDFPageBoxInfo info; | ||||||
|  |         info.mediaBox = page->getMediaBoxMM(); | ||||||
|  |         info.cropBox = page->getCropBoxMM(); | ||||||
|  |         info.bleedBox = page->getBleedBoxMM(); | ||||||
|  |         info.trimBox = page->getTrimBoxMM(); | ||||||
|  |         info.artBox = page->getArtBoxMM(); | ||||||
|  |  | ||||||
|  |         auto it = std::find(infos.begin(), infos.end(), info); | ||||||
|  |         if (it != infos.end()) | ||||||
|  |         { | ||||||
|  |             it->pages.addValue(pageIndex + 1); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             info.pages.addValue(pageIndex + 1); | ||||||
|  |             infos.emplace_back(qMove(info)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     QLocale locale; | ||||||
|  |  | ||||||
|  |     PDFOutputFormatter formatter(options.outputStyle, options.outputCodec); | ||||||
|  |     formatter.beginDocument("info-page-boxes", PDFToolTranslationContext::tr("Page boxes in document %1").arg(options.document)); | ||||||
|  |  | ||||||
|  |     auto writeBox = [&formatter, &locale](const QString& name, const QString& title, const QRectF& rect) | ||||||
|  |     { | ||||||
|  |         formatter.beginTableRow(name); | ||||||
|  |         formatter.writeTableColumn("title", title); | ||||||
|  |  | ||||||
|  |         if (rect.isValid()) | ||||||
|  |         { | ||||||
|  |             formatter.writeTableColumn("value", QString("[ %1 %2 %3 %4 ]").arg(locale.toString(rect.left()), locale.toString(rect.top()), locale.toString(rect.right()), locale.toString(rect.bottom()))); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             formatter.writeTableColumn("value", "null"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         formatter.endTableRow(); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     for (const PDFPageBoxInfo& info : infos) | ||||||
|  |     { | ||||||
|  |         formatter.endl(); | ||||||
|  |         formatter.beginTable("page-range", PDFToolTranslationContext::tr("Pages %1").arg(info.pages.toText())); | ||||||
|  |  | ||||||
|  |         formatter.beginTableHeaderRow("header"); | ||||||
|  |         formatter.writeTableHeaderColumn("box", PDFToolTranslationContext::tr("Box"), Qt::AlignLeft); | ||||||
|  |         formatter.writeTableHeaderColumn("value", PDFToolTranslationContext::tr("Value"), Qt::AlignLeft); | ||||||
|  |         formatter.endTableHeaderRow(); | ||||||
|  |  | ||||||
|  |         writeBox("media", PDFToolTranslationContext::tr("Media"), info.mediaBox); | ||||||
|  |         writeBox("crop", PDFToolTranslationContext::tr("Crop"), info.cropBox); | ||||||
|  |         writeBox("bleed", PDFToolTranslationContext::tr("Bleed"), info.bleedBox); | ||||||
|  |         writeBox("trim", PDFToolTranslationContext::tr("Trim"), info.trimBox); | ||||||
|  |         writeBox("art", PDFToolTranslationContext::tr("Art"), info.artBox); | ||||||
|  |  | ||||||
|  |         formatter.endTable(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     formatter.endDocument(); | ||||||
|  |     PDFConsole::writeText(formatter.getString(), options.outputCodec); | ||||||
|  |  | ||||||
|  |     return ExitSuccess; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | PDFToolAbstractApplication::Options PDFToolInfoPageBoxesApplication::getOptionsFlags() const | ||||||
|  | { | ||||||
|  |     return ConsoleFormat | OpenDocument | PageSelector; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }   // namespace pdftool | ||||||
							
								
								
									
										37
									
								
								PdfTool/pdftoolinfopageboxes.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								PdfTool/pdftoolinfopageboxes.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | //    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 <https://www.gnu.org/licenses/>. | ||||||
|  |  | ||||||
|  | #ifndef PDFTOOLINFOPAGEBOXES_H | ||||||
|  | #define PDFTOOLINFOPAGEBOXES_H | ||||||
|  |  | ||||||
|  | #include "pdftoolabstractapplication.h" | ||||||
|  |  | ||||||
|  | namespace pdftool | ||||||
|  | { | ||||||
|  |  | ||||||
|  | class PDFToolInfoPageBoxesApplication : 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 // PDFTOOLINFOPAGEBOXES_H | ||||||
		Reference in New Issue
	
	Block a user