mirror of https://github.com/JakubMelka/PDF4QT.git
Font tool finished
This commit is contained in:
parent
6142b263a0
commit
acee5f2186
|
@ -360,6 +360,9 @@ public:
|
||||||
|
|
||||||
/// Dumps information about the font
|
/// Dumps information about the font
|
||||||
virtual void dumpFontToTreeItem(QTreeWidgetItem* item) const { Q_UNUSED(item); }
|
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
|
/// 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 void fillTextSequence(const QByteArray& byteArray, TextSequence& textSequence, PDFRenderErrorReporter* reporter) override;
|
||||||
virtual bool isHorizontalWritingSystem() const override { return !m_isVertical; }
|
virtual bool isHorizontalWritingSystem() const override { return !m_isVertical; }
|
||||||
virtual void dumpFontToTreeItem(QTreeWidgetItem* item) const override;
|
virtual void dumpFontToTreeItem(QTreeWidgetItem* item) const override;
|
||||||
|
virtual QString getPostScriptName() const override { return m_postScriptName; }
|
||||||
|
|
||||||
static constexpr const PDFReal PIXEL_SIZE_MULTIPLIER = 100.0;
|
static constexpr const PDFReal PIXEL_SIZE_MULTIPLIER = 100.0;
|
||||||
|
|
||||||
|
@ -446,6 +450,9 @@ private:
|
||||||
|
|
||||||
/// True, if font has vertical writing system
|
/// True, if font has vertical writing system
|
||||||
bool m_isVertical;
|
bool m_isVertical;
|
||||||
|
|
||||||
|
/// Postscript name of the font
|
||||||
|
QString m_postScriptName;
|
||||||
};
|
};
|
||||||
|
|
||||||
PDFRealizedFontImpl::PDFRealizedFontImpl() :
|
PDFRealizedFontImpl::PDFRealizedFontImpl() :
|
||||||
|
@ -774,6 +781,11 @@ void PDFRealizedFont::dumpFontToTreeItem(QTreeWidgetItem* item) const
|
||||||
m_impl->dumpFontToTreeItem(item);
|
m_impl->dumpFontToTreeItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString PDFRealizedFont::getPostScriptName() const
|
||||||
|
{
|
||||||
|
return m_impl->getPostScriptName();
|
||||||
|
}
|
||||||
|
|
||||||
PDFRealizedFontPointer PDFRealizedFont::createRealizedFont(PDFFontPointer font, PDFReal pixelSize, PDFRenderErrorReporter* reporter)
|
PDFRealizedFontPointer PDFRealizedFont::createRealizedFont(PDFFontPointer font, PDFReal pixelSize, PDFRenderErrorReporter* reporter)
|
||||||
{
|
{
|
||||||
PDFRealizedFontPointer result;
|
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)));
|
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_isVertical = impl->m_face->face_flags & FT_FACE_FLAG_VERTICAL;
|
||||||
impl->m_isEmbedded = false;
|
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()));
|
result.reset(new PDFRealizedFont(implPtr.release()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,6 +239,9 @@ public:
|
||||||
/// Adds information about the font into tree item
|
/// Adds information about the font into tree item
|
||||||
void dumpFontToTreeItem(QTreeWidgetItem* item) const;
|
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,
|
/// Creates new realized font from the standard font. If font can't be created,
|
||||||
/// then exception is thrown.
|
/// then exception is thrown.
|
||||||
static PDFRealizedFontPointer createRealizedFont(PDFFontPointer font, PDFReal pixelSize, PDFRenderErrorReporter* reporter);
|
static PDFRealizedFontPointer createRealizedFont(PDFFontPointer font, PDFReal pixelSize, PDFRenderErrorReporter* reporter);
|
||||||
|
|
|
@ -57,6 +57,7 @@ struct FontInfo
|
||||||
bool isSubset = false;
|
bool isSubset = false;
|
||||||
bool isToUnicodePresent = false;
|
bool isToUnicodePresent = false;
|
||||||
pdf::PDFObjectReference reference;
|
pdf::PDFObjectReference reference;
|
||||||
|
QString substitutedFont;
|
||||||
};
|
};
|
||||||
|
|
||||||
int PDFToolInfoFonts::execute(const PDFToolOptions& options)
|
int PDFToolInfoFonts::execute(const PDFToolOptions& options)
|
||||||
|
@ -191,10 +192,11 @@ int PDFToolInfoFonts::execute(const PDFToolOptions& options)
|
||||||
info.fontName = fontName;
|
info.fontName = fontName;
|
||||||
info.pages.addValue(pageIndex + 1);
|
info.pages.addValue(pageIndex + 1);
|
||||||
info.fontTypeName = fontTypeName;
|
info.fontTypeName = fontTypeName;
|
||||||
info.isEmbedded = fontDescriptor->isEmbedded();
|
info.isEmbedded = fontDescriptor->isEmbedded() || fontType == pdf::FontType::Type3;
|
||||||
info.isSubset = isSubset;
|
info.isSubset = isSubset;
|
||||||
info.isToUnicodePresent = toUnicode && toUnicode->isValid();
|
info.isToUnicodePresent = toUnicode && toUnicode->isValid();
|
||||||
info.reference = fontReference;
|
info.reference = fontReference;
|
||||||
|
info.substitutedFont = realizedFont->getPostScriptName();
|
||||||
|
|
||||||
const pdf::PDFSimpleFont* simpleFont = dynamic_cast<const pdf::PDFSimpleFont*>(font.data());
|
const pdf::PDFSimpleFont* simpleFont = dynamic_cast<const pdf::PDFSimpleFont*>(font.data());
|
||||||
if (simpleFont)
|
if (simpleFont)
|
||||||
|
@ -290,6 +292,7 @@ int PDFToolInfoFonts::execute(const PDFToolOptions& options)
|
||||||
QString noText = PDFToolTranslationContext::tr("No");
|
QString noText = PDFToolTranslationContext::tr("No");
|
||||||
QString noRef = PDFToolTranslationContext::tr("--");
|
QString noRef = PDFToolTranslationContext::tr("--");
|
||||||
|
|
||||||
|
bool hasSubstitutions = false;
|
||||||
int ref = 1;
|
int ref = 1;
|
||||||
for (const FontInfo& info : directFonts)
|
for (const FontInfo& info : directFonts)
|
||||||
{
|
{
|
||||||
|
@ -315,12 +318,62 @@ int PDFToolInfoFonts::execute(const PDFToolOptions& options)
|
||||||
formatter.writeTableColumn("generation-no", noRef, Qt::AlignRight);
|
formatter.writeTableColumn("generation-no", noRef, Qt::AlignRight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hasSubstitutions = hasSubstitutions || !info.isEmbedded;
|
||||||
|
|
||||||
formatter.endTableRow();
|
formatter.endTableRow();
|
||||||
++ref;
|
++ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
formatter.endTable();
|
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();
|
formatter.endDocument();
|
||||||
PDFConsole::writeText(formatter.getString(), options.outputCodec);
|
PDFConsole::writeText(formatter.getString(), options.outputCodec);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue