mirror of
https://github.com/JakubMelka/PDF4QT.git
synced 2025-06-05 21:59:17 +02:00
Object classifier
This commit is contained in:
@ -34,24 +34,69 @@ ObjectInspectorDialog::ObjectInspectorDialog(const pdf::PDFDocument* document, Q
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
m_objectClassifier.classify(document);
|
||||
|
||||
ui->modeComboBox->addItem(tr("Document"), int(PDFObjectInspectorTreeItemModel::Document));
|
||||
ui->modeComboBox->addItem(tr("Pages"), int(PDFObjectInspectorTreeItemModel::Page));
|
||||
ui->modeComboBox->addItem(tr("Images"), int(PDFObjectInspectorTreeItemModel::Image));
|
||||
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::ContentStream))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Content streams"), int(PDFObjectInspectorTreeItemModel::ContentStream));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::GraphicState))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Graphic states"), int(PDFObjectInspectorTreeItemModel::GraphicState));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::ColorSpace))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Color spaces"), int(PDFObjectInspectorTreeItemModel::ColorSpace));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Pattern))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Patterns"), int(PDFObjectInspectorTreeItemModel::Pattern));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Shading))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Shadings"), int(PDFObjectInspectorTreeItemModel::Shading));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Image))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Images"), int(PDFObjectInspectorTreeItemModel::Image));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Form))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Forms"), int(PDFObjectInspectorTreeItemModel::Form));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Font))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Fonts"), int(PDFObjectInspectorTreeItemModel::Font));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Action))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Actions"), int(PDFObjectInspectorTreeItemModel::Action));
|
||||
}
|
||||
if (m_objectClassifier.hasType(pdf::PDFObjectClassifier::Annotation))
|
||||
{
|
||||
ui->modeComboBox->addItem(tr("Annotations"), int(PDFObjectInspectorTreeItemModel::Annotation));
|
||||
}
|
||||
|
||||
ui->modeComboBox->addItem(tr("Object List"), int(PDFObjectInspectorTreeItemModel::List));
|
||||
|
||||
ui->modeComboBox->setCurrentIndex(ui->modeComboBox->findData(int(PDFObjectInspectorTreeItemModel::Document)));
|
||||
connect(ui->modeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ObjectInspectorDialog::onModeChanged);
|
||||
|
||||
m_model = new PDFObjectInspectorTreeItemModel(this);
|
||||
m_model = new PDFObjectInspectorTreeItemModel(&m_objectClassifier, this);
|
||||
onModeChanged();
|
||||
m_model->setDocument(pdf::PDFModifiedDocument(const_cast<pdf::PDFDocument*>(document), nullptr, pdf::PDFModifiedDocument::Reset));
|
||||
|
||||
ui->objectTreeView->setRootIsDecorated(true);
|
||||
ui->objectTreeView->setModel(m_model);
|
||||
|
||||
QSplitter* splitter = new QSplitter(this);
|
||||
splitter->addWidget(ui->objectTreeView);
|
||||
splitter->addWidget(ui->tabWidget);
|
||||
ui->splitter->setStretchFactor(0, 0);
|
||||
ui->splitter->setStretchFactor(1, 1);
|
||||
ui->splitter->setCollapsible(0, true);
|
||||
ui->splitter->setCollapsible(1, true);
|
||||
ui->splitter->setSizes(QList<int>() << pdf::PDFWidgetUtils::scaleDPI_x(this, 300) << pdf::PDFWidgetUtils::scaleDPI_x(this, 200));
|
||||
|
||||
ui->objectTreeView->setMinimumWidth(pdf::PDFWidgetUtils::scaleDPI_x(this, 200));
|
||||
setMinimumSize(pdf::PDFWidgetUtils::scaleDPI(this, QSize(800, 600)));
|
||||
|
@ -19,6 +19,7 @@
|
||||
#define OBJECTINSPECTORDIALOG_H
|
||||
|
||||
#include "pdfdocument.h"
|
||||
#include "pdfobjectutils.h"
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
@ -44,6 +45,7 @@ private:
|
||||
|
||||
Ui::ObjectInspectorDialog* ui;
|
||||
const pdf::PDFDocument* m_document;
|
||||
pdf::PDFObjectClassifier m_objectClassifier;
|
||||
PDFObjectInspectorTreeItemModel* m_model;
|
||||
};
|
||||
|
||||
|
@ -13,15 +13,47 @@
|
||||
<property name="windowTitle">
|
||||
<string>Object Inspector</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1">
|
||||
<item row="1" column="0">
|
||||
<widget class="QTreeView" name="objectTreeView">
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QGroupBox" name="objectViewGroupBox">
|
||||
<property name="title">
|
||||
<string>Objects</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QComboBox" name="modeComboBox"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTreeView" name="objectTreeView">
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>Tab 1</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>Tab 2</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
@ -31,23 +63,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QComboBox" name="modeComboBox"/>
|
||||
</item>
|
||||
<item row="0" column="1" rowspan="2">
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>Tab 1</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>Tab 2</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "pdfobjectinspectortreeitemmodel.h"
|
||||
#include "pdfdocument.h"
|
||||
#include "pdfvisitor.h"
|
||||
#include "pdfencoding.h"
|
||||
|
||||
#include <stack>
|
||||
|
||||
@ -84,8 +85,9 @@ void PDFObjectInspectorTreeItem::setObject(const pdf::PDFObject& object)
|
||||
m_object = object;
|
||||
}
|
||||
|
||||
PDFObjectInspectorTreeItemModel::PDFObjectInspectorTreeItemModel(QObject* parent) :
|
||||
pdf::PDFTreeItemModel(parent)
|
||||
PDFObjectInspectorTreeItemModel::PDFObjectInspectorTreeItemModel(const pdf::PDFObjectClassifier* classifier, QObject* parent) :
|
||||
pdf::PDFTreeItemModel(parent),
|
||||
m_classifier(classifier)
|
||||
{
|
||||
}
|
||||
|
||||
@ -100,6 +102,8 @@ QVariant PDFObjectInspectorTreeItemModel::headerData(int section, Qt::Orientatio
|
||||
|
||||
int PDFObjectInspectorTreeItemModel::columnCount(const QModelIndex& parent) const
|
||||
{
|
||||
Q_UNUSED(parent);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -119,7 +123,7 @@ QVariant PDFObjectInspectorTreeItemModel::data(const QModelIndex& index, int rol
|
||||
const PDFObjectInspectorTreeItem* parent = static_cast<const PDFObjectInspectorTreeItem*>(index.parent().internalPointer());
|
||||
|
||||
QStringList data;
|
||||
if (item->getReference().isValid() && parent && !parent->getReference().isValid())
|
||||
if (item->getReference().isValid() && (!parent || (parent && !parent->getReference().isValid())))
|
||||
{
|
||||
data << QString("%1 %2 R").arg(item->getReference().objectNumber).arg(item->getReference().generation);
|
||||
}
|
||||
@ -152,7 +156,7 @@ QVariant PDFObjectInspectorTreeItemModel::data(const QModelIndex& index, int rol
|
||||
break;
|
||||
|
||||
case pdf::PDFObject::Type::String:
|
||||
data << QString("\"%1\"").arg(QString::fromLatin1(object.getString().toPercentEncoding()));
|
||||
data << QString("\"%1\"").arg(pdf::PDFEncoding::convertSmartFromByteStringToRepresentableQString(object.getString()));
|
||||
break;
|
||||
|
||||
case pdf::PDFObject::Type::Name:
|
||||
@ -168,7 +172,7 @@ QVariant PDFObjectInspectorTreeItemModel::data(const QModelIndex& index, int rol
|
||||
break;
|
||||
|
||||
case pdf::PDFObject::Type::Stream:
|
||||
data << tr("Stream [%1 items, %2 data bytes]").arg(locale.toString(object.getStream()->getDictionary()->getCount())).arg(locale.toString(object.getStream()->getContent()->size()));
|
||||
data << tr("Stream [%1 items, %2 data bytes]").arg(locale.toString(object.getStream()->getDictionary()->getCount()), locale.toString(object.getStream()->getContent()->size()));
|
||||
break;
|
||||
|
||||
case pdf::PDFObject::Type::Reference:
|
||||
@ -193,6 +197,17 @@ void PDFObjectInspectorTreeItemModel::update()
|
||||
{
|
||||
std::set<pdf::PDFObjectReference> usedReferences;
|
||||
|
||||
auto createObjectsFromClassifier = [this, &usedReferences](pdf::PDFObjectClassifier::Type type)
|
||||
{
|
||||
m_rootItem.reset(new PDFObjectInspectorTreeItem());
|
||||
|
||||
for (pdf::PDFObjectReference reference : m_classifier->getObjectsByType(type))
|
||||
{
|
||||
pdf::PDFObject object = m_document->getStorage().getObjectByReference(reference);
|
||||
createObjectItem(getRootItem(), reference, object, true, usedReferences);
|
||||
}
|
||||
};
|
||||
|
||||
switch (m_mode)
|
||||
{
|
||||
case pdfplugin::PDFObjectInspectorTreeItemModel::Document:
|
||||
@ -221,7 +236,44 @@ void PDFObjectInspectorTreeItemModel::update()
|
||||
break;
|
||||
}
|
||||
|
||||
case pdfplugin::PDFObjectInspectorTreeItemModel::Image:
|
||||
case ContentStream:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::ContentStream);
|
||||
break;
|
||||
|
||||
case GraphicState:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::GraphicState);
|
||||
break;
|
||||
|
||||
case ColorSpace:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::ColorSpace);
|
||||
break;
|
||||
|
||||
case Pattern:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::Pattern);
|
||||
break;
|
||||
|
||||
case Shading:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::Shading);
|
||||
break;
|
||||
|
||||
case Image:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::Image);
|
||||
break;
|
||||
|
||||
case Form:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::Form);
|
||||
break;
|
||||
|
||||
case Font:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::Font);
|
||||
break;
|
||||
|
||||
case Action:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::Action);
|
||||
break;
|
||||
|
||||
case Annotation:
|
||||
createObjectsFromClassifier(pdf::PDFObjectClassifier::Annotation);
|
||||
break;
|
||||
|
||||
case pdfplugin::PDFObjectInspectorTreeItemModel::List:
|
||||
@ -392,7 +444,7 @@ void PDFCreateObjectInspectorTreeItemFromObjectVisitor::visitReference(const pdf
|
||||
{
|
||||
Q_ASSERT(m_usedReferences);
|
||||
|
||||
if (!m_usedReferences->count(reference))
|
||||
if (m_usedReferences->count(reference))
|
||||
{
|
||||
// Reference already followed
|
||||
return;
|
||||
|
@ -19,6 +19,7 @@
|
||||
#define PDFOBJECTINSPECTORTREEITEMMODEL_H
|
||||
|
||||
#include "pdfitemmodels.h"
|
||||
#include "pdfobjectutils.h"
|
||||
|
||||
#include <set>
|
||||
|
||||
@ -37,11 +38,20 @@ public:
|
||||
{
|
||||
Document,
|
||||
Page,
|
||||
ContentStream,
|
||||
GraphicState,
|
||||
ColorSpace,
|
||||
Pattern,
|
||||
Shading,
|
||||
Image,
|
||||
Form,
|
||||
Font,
|
||||
Action,
|
||||
Annotation,
|
||||
List
|
||||
};
|
||||
|
||||
explicit PDFObjectInspectorTreeItemModel(QObject* parent);
|
||||
explicit PDFObjectInspectorTreeItemModel(const pdf::PDFObjectClassifier* classifier, QObject* parent);
|
||||
|
||||
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||
virtual int columnCount(const QModelIndex& parent) const override;
|
||||
@ -59,6 +69,7 @@ private:
|
||||
|
||||
PDFObjectInspectorTreeItem* getRootItem();
|
||||
|
||||
const pdf::PDFObjectClassifier* m_classifier;
|
||||
Mode m_mode = List;
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user