From acee5f2186928dc3b034755a2866136c8176bfdf Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Sat, 24 Oct 2020 15:36:00 +0200 Subject: [PATCH] Font tool finished --- PdfForQtLib/sources/pdffont.cpp | 16 ++++++++++ PdfForQtLib/sources/pdffont.h | 3 ++ PdfTool/pdftoolinfofonts.cpp | 55 ++++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/PdfForQtLib/sources/pdffont.cpp b/PdfForQtLib/sources/pdffont.cpp index 8653da9..495df9e 100644 --- a/PdfForQtLib/sources/pdffont.cpp +++ b/PdfForQtLib/sources/pdffont.cpp @@ -360,6 +360,9 @@ public: /// Dumps information about the font virtual void dumpFontToTreeItem(QTreeWidgetItem* item) const { Q_UNUSED(item); } + + /// Returns postscript name of the font + virtual QString getPostScriptName() const { return QString(); } }; /// Implementation of the PDFRealizedFont class using PIMPL pattern for Type 3 fonts @@ -390,6 +393,7 @@ public: virtual void fillTextSequence(const QByteArray& byteArray, TextSequence& textSequence, PDFRenderErrorReporter* reporter) override; virtual bool isHorizontalWritingSystem() const override { return !m_isVertical; } virtual void dumpFontToTreeItem(QTreeWidgetItem* item) const override; + virtual QString getPostScriptName() const override { return m_postScriptName; } static constexpr const PDFReal PIXEL_SIZE_MULTIPLIER = 100.0; @@ -446,6 +450,9 @@ private: /// True, if font has vertical writing system bool m_isVertical; + + /// Postscript name of the font + QString m_postScriptName; }; PDFRealizedFontImpl::PDFRealizedFontImpl() : @@ -774,6 +781,11 @@ void PDFRealizedFont::dumpFontToTreeItem(QTreeWidgetItem* item) const m_impl->dumpFontToTreeItem(item); } +QString PDFRealizedFont::getPostScriptName() const +{ + return m_impl->getPostScriptName(); +} + PDFRealizedFontPointer PDFRealizedFont::createRealizedFont(PDFFontPointer font, PDFReal pixelSize, PDFRenderErrorReporter* reporter) { PDFRealizedFontPointer result; @@ -832,6 +844,10 @@ PDFRealizedFontPointer PDFRealizedFont::createRealizedFont(PDFFontPointer font, PDFRealizedFontImpl::checkFreeTypeError(FT_Set_Pixel_Sizes(impl->m_face, 0, qRound(pixelSize * PDFRealizedFontImpl::PIXEL_SIZE_MULTIPLIER))); impl->m_isVertical = impl->m_face->face_flags & FT_FACE_FLAG_VERTICAL; impl->m_isEmbedded = false; + if (const char* postScriptName = FT_Get_Postscript_Name(impl->m_face)) + { + impl->m_postScriptName = QString::fromLatin1(postScriptName); + } result.reset(new PDFRealizedFont(implPtr.release())); } } diff --git a/PdfForQtLib/sources/pdffont.h b/PdfForQtLib/sources/pdffont.h index 1cd9cc1..fe46ec1 100644 --- a/PdfForQtLib/sources/pdffont.h +++ b/PdfForQtLib/sources/pdffont.h @@ -239,6 +239,9 @@ public: /// Adds information about the font into tree item void dumpFontToTreeItem(QTreeWidgetItem* item) const; + /// Returns postscript name of the font + QString getPostScriptName() const; + /// Creates new realized font from the standard font. If font can't be created, /// then exception is thrown. static PDFRealizedFontPointer createRealizedFont(PDFFontPointer font, PDFReal pixelSize, PDFRenderErrorReporter* reporter); diff --git a/PdfTool/pdftoolinfofonts.cpp b/PdfTool/pdftoolinfofonts.cpp index eaa26ef..c0fad15 100644 --- a/PdfTool/pdftoolinfofonts.cpp +++ b/PdfTool/pdftoolinfofonts.cpp @@ -57,6 +57,7 @@ struct FontInfo bool isSubset = false; bool isToUnicodePresent = false; pdf::PDFObjectReference reference; + QString substitutedFont; }; int PDFToolInfoFonts::execute(const PDFToolOptions& options) @@ -191,10 +192,11 @@ int PDFToolInfoFonts::execute(const PDFToolOptions& options) info.fontName = fontName; info.pages.addValue(pageIndex + 1); info.fontTypeName = fontTypeName; - info.isEmbedded = fontDescriptor->isEmbedded(); + info.isEmbedded = fontDescriptor->isEmbedded() || fontType == pdf::FontType::Type3; info.isSubset = isSubset; info.isToUnicodePresent = toUnicode && toUnicode->isValid(); info.reference = fontReference; + info.substitutedFont = realizedFont->getPostScriptName(); const pdf::PDFSimpleFont* simpleFont = dynamic_cast(font.data()); if (simpleFont) @@ -290,6 +292,7 @@ int PDFToolInfoFonts::execute(const PDFToolOptions& options) QString noText = PDFToolTranslationContext::tr("No"); QString noRef = PDFToolTranslationContext::tr("--"); + bool hasSubstitutions = false; int ref = 1; for (const FontInfo& info : directFonts) { @@ -315,12 +318,62 @@ int PDFToolInfoFonts::execute(const PDFToolOptions& options) formatter.writeTableColumn("generation-no", noRef, Qt::AlignRight); } + hasSubstitutions = hasSubstitutions || !info.isEmbedded; + formatter.endTableRow(); ++ref; } formatter.endTable(); + formatter.endl(); + + if (hasSubstitutions) + { + formatter.beginTable("fonts-substitutions", PDFToolTranslationContext::tr("Substitutions")); + + formatter.beginTableHeaderRow("header"); + formatter.writeTableHeaderColumn("no", PDFToolTranslationContext::tr("No."), Qt::AlignLeft); + formatter.writeTableHeaderColumn("font-name", PDFToolTranslationContext::tr("Font Name"), Qt::AlignLeft); + formatter.writeTableHeaderColumn("font-substitute", PDFToolTranslationContext::tr("Substituted by Font"), Qt::AlignLeft); + formatter.writeTableHeaderColumn("match", PDFToolTranslationContext::tr("Match"), Qt::AlignLeft); + formatter.writeTableHeaderColumn("object-no", PDFToolTranslationContext::tr("Object"), Qt::AlignLeft); + formatter.writeTableHeaderColumn("generation-no", PDFToolTranslationContext::tr("Gen."), Qt::AlignLeft); + formatter.endTableHeaderRow(); + + ref = 1; + for (const FontInfo& info : directFonts) + { + if (info.isEmbedded) + { + continue; + } + + formatter.beginTableRow("substitution", ref); + + formatter.writeTableColumn("no", locale.toString(ref), Qt::AlignRight); + formatter.writeTableColumn("font-name", info.fontName); + formatter.writeTableColumn("font-substitute", !info.substitutedFont.isEmpty() ? info.substitutedFont : PDFToolTranslationContext::tr("??")); + formatter.writeTableColumn("match", (info.fontName == info.substitutedFont) ? yesText : noText); + + if (info.reference.isValid()) + { + formatter.writeTableColumn("object-no", locale.toString(info.reference.objectNumber), Qt::AlignRight); + formatter.writeTableColumn("generation-no", locale.toString(info.reference.generation), Qt::AlignRight); + } + else + { + formatter.writeTableColumn("object-no", noRef, Qt::AlignRight); + formatter.writeTableColumn("generation-no", noRef, Qt::AlignRight); + } + + formatter.endTableRow(); + ++ref; + } + + formatter.endTable(); + } + formatter.endDocument(); PDFConsole::writeText(formatter.getString(), options.outputCodec);