XFA: xfa engine parsing template

This commit is contained in:
Jakub Melka 2021-11-04 20:01:30 +01:00
parent 624794554c
commit f739e9f544
5 changed files with 92 additions and 2 deletions

View File

@ -242,7 +242,7 @@ DEPENDPATH += $$Pdf4Qt_DEPENDENCIES_PATH/lcms2/include
# ensure debug info even for RELEASE build
CONFIG += force_debug_info
QMAKE_CXXFLAGS += /std:c++latest /utf-8
QMAKE_CXXFLAGS += /std:c++latest /utf-8 /bigobj
QMAKE_RESOURCE_FLAGS += -threshold 0 -compress 9
PdfforQt_library.files = $$DESTDIR/Pdf4QtLib.dll

View File

@ -1161,6 +1161,8 @@ void PDFFormManager::setDocument(const PDFModifiedDocument& document)
// Just update field values
updateFieldValues();
}
m_xfaEngine.setDocument(document, &m_form);
}
}

View File

@ -23,6 +23,7 @@
#include "pdfannotation.h"
#include "pdfdocumentdrawinterface.h"
#include "pdfsignaturehandler.h"
#include "pdfxfaengine.h"
#include <QTextLayout>
@ -720,6 +721,8 @@ private:
PDFForm m_form;
bool m_isCommitDisabled;
PDFXFAEngine m_xfaEngine;
std::vector<PDFFormFieldWidgetEditor*> m_widgetEditors;
PDFFormFieldWidgetEditor* m_focusedEditor;
MouseGrabInfo m_mouseGrabInfo;

View File

@ -16,8 +16,10 @@
// along with PDF4QT. If not, see <https://www.gnu.org/licenses/>.
#include "pdfxfaengine.h"
#include "pdfform.h"
#include <QDomElement>
#include <QDomDocument>
#include <optional>
@ -8887,10 +8889,16 @@ std::optional<XFA_variables> XFA_variables::parse(const QDomElement& element)
class PDFXFAEngineImpl
{
public:
PDFXFAEngineImpl() = default;
PDFXFAEngineImpl();
void setDocument(const PDFModifiedDocument& document, PDFForm* form);
private:
void clear();
xfa::XFA_Node<xfa::XFA_template> m_template;
const PDFDocument* m_document;
PDFForm* m_form;
};
PDFXFAEngine::PDFXFAEngine() :
@ -8904,4 +8912,77 @@ PDFXFAEngine::~PDFXFAEngine()
}
void PDFXFAEngine::setDocument(const PDFModifiedDocument& document, PDFForm* form)
{
m_impl->setDocument(document, form);
}
PDFXFAEngineImpl::PDFXFAEngineImpl() :
m_document(nullptr),
m_form(nullptr)
{
}
void PDFXFAEngineImpl::setDocument(const PDFModifiedDocument& document, PDFForm* form)
{
if (m_document != document || document.hasReset())
{
m_document = document;
if (document.hasReset())
{
clear();
if (form->getFormType() == PDFForm::FormType::XFAForm)
{
try
{
const PDFObject& xfaObject = m_document->getObject(form->getXFA());
std::map<QByteArray, QByteArray> xfaData;
if (xfaObject.isArray())
{
const PDFArray* xfaArrayData = xfaObject.getArray();
const size_t pairCount = xfaArrayData->getCount() / 2;
for (size_t i = 0; i < pairCount; ++i)
{
const PDFObject& itemName = m_document->getObject(xfaArrayData->getItem(2 * i + 0));
const PDFObject& streamObject = m_document->getObject(xfaArrayData->getItem(2 * i + 1));
if (itemName.isString() && streamObject.isStream())
{
xfaData[itemName.getString()] = m_document->getDecodedStream(streamObject.getStream());
}
}
}
else if (xfaObject.isStream())
{
xfaData["template"] = m_document->getDecodedStream(xfaObject.getStream());
}
QDomDocument document;
if (document.setContent(xfaData["template"]))
{
m_template = xfa::XFA_template::parse(document.firstChildElement("template"));
}
}
catch (PDFException)
{
// Just clear once again - if some errorneous data
// were read, we want to clear them.
clear();
}
}
}
}
}
void PDFXFAEngineImpl::clear()
{
// Clear the template
m_template = xfa::XFA_Node<xfa::XFA_template>();
}
} // namespace pdf

View File

@ -19,12 +19,14 @@
#define PDFXFAENGINE_H
#include "pdfglobal.h"
#include "pdfdocument.h"
#include <memory>
namespace pdf
{
class PDFForm;
class PDFXFAEngineImpl;
class PDFXFAEngine
@ -33,6 +35,8 @@ public:
PDFXFAEngine();
~PDFXFAEngine();
void setDocument(const PDFModifiedDocument& document, PDFForm* form);
private:
std::unique_ptr<PDFXFAEngineImpl> m_impl;
};