Subversion Repositories Scribus

Rev

Rev 24826 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/


#ifndef PDFANALYZER_H
#define PDFANALYZER_H

#include <QList>
#include <QObject>
#include <QPair>
#include <QString>
#include <QTransform>
#include "scconfig.h"

#ifdef HAVE_PODOFO
#include <podofo/podofo.h>
#endif

enum PDFContentStreamKeyword
{
        KW_k,
        KW_K,
        KW_rg,
        KW_RG,
        KW_g,
        KW_G,
        KW_CS,
        KW_cs,
        KW_SC,
        KW_SCN,
        KW_sc,
        KW_scn,
        KW_Do,
        KW_BI,
        KW_ID,
        KW_EI,
        KW_gs,
        KW_Tf,
        KW_cm,
        KW_q,
        KW_Q,
        KW_w,
        KW_J,
        KW_j,
        KW_M,
        KW_d,
        KW_Undefined
};
enum PDFColorSpace
{
        CS_DeviceGray,
        CS_DeviceRGB,
        CS_DeviceCMYK,
        CS_CalGray,
        CS_CalRGB,
        CS_Lab,
        CS_ICCBased,
        CS_Pattern,
        CS_Indexed,
        CS_Separation,
        CS_DeviceN,
        CS_Unknown
};
enum PDFFontType
{
        F_Type1,
        F_MMType1,
        F_TrueType,
        F_Type3,
        F_CIDFontType0,
        F_CIDFontType2,
        F_Unknown
};
struct PDFFont
{
        PDFFontType fontType;
        bool isEmbedded;
        bool isOpenType;
        PDFFont()
        {
                fontType = F_Unknown;
                isEmbedded = false;
                isOpenType = false;
        }
};
struct PDFGraphicState
{
        QTransform ctm;
        PDFColorSpace strokeCS;
        PDFColorSpace fillCS;
        QList<double> strokeColor;
        QList<double> fillColor;
        double lineWidth;
        int lineCap;
        int lineJoin;
        double miterLimit;
        QPair<QList<int>, int> dashPattern;
        QPair<PDFFont, double> font;
        QList<QString> blendModes;
        double fillAlphaConstant;
        double strokeAlphaConstant;
        PDFGraphicState()
        {
                strokeCS = CS_DeviceGray;
                fillCS = CS_DeviceGray;
                strokeColor.append(0);
                fillColor.append(0);
                lineWidth = 1;
                lineCap = 0;
                lineJoin = 0;
                miterLimit = 10;
                QList<int> dashArray;
                int dashPhase = 0;
                dashPattern.first = dashArray;
                dashPattern.second = dashPhase;
                blendModes.append("Normal");
                fillAlphaConstant = 1;
                strokeAlphaConstant = 1;
        }
};
struct PDFImage
{
        QString imgName;
        int dpiX;
        int dpiY;
};

/**
 * PDFAnalyzer provides the facility to report various properties of a PDF.
 * At the moment, it can parse/analyze and record used color spaces, the use of transparency,
 * used fonts, and existing images in a page of a PDF.
 *
 * This class will be used by DocumentChecker's class to preflight and report any incompatible
 * properties according to a checker's profile.
 */

class PDFAnalyzer : public QObject
{
        Q_OBJECT

public:
        /**
         * Instantiate a new PDFAnalyzer that will operate on the PDF specified by `filename'.
         *
         * \param filename Path to the PDF being analyzed.
         */

        PDFAnalyzer(QString& filename);
        ~PDFAnalyzer();

        /**
         * Perform the actual inspection on one page of the PDF.
         *
         * \return A boolean is return indicating whether the process is successful.
         * \param pageNum Specifying the page's number (zero-based) in the PDF where the analyzing process is operated on.
         * \param usedColorSpaces List of used color spaces in the page which will be filled while processing.
         * \param hasTransparency A boolean which will be set to true after analyzing if the page contains transparency.
         * \param usedFonts List of used fonts in the page which will be filled while processing.
         * \param imgs List of images that this page contains.
         */

        bool inspectPDF(int pageNum, QList<PDFColorSpace> & usedColorSpaces, bool & hasTransparency, QList<PDFFont> & usedFonts, QList<PDFImage> & imgs);
#ifdef HAVE_PODOFO
private:
        // pointer to the PoDoFo Pdf's object
        PoDoFo::PdfMemDocument* m_doc;

        // Path to the analyzed file
        QString m_filename;

        // Call to this method to inspect a PdfCanvas (either a PdfPage or PdfXObject of subtype Form). This method will be called by inspectPDF
        // to start inspecting a PDF's page; it could well be called recursively to continue analyzing further in case form XObjects are painted
        // onto the page.
        bool inspectCanvas(PoDoFo::PdfCanvas* canvas, QList<PDFColorSpace> & usedColorSpaces, bool & hasTransparency, QList<PDFFont> & usedFonts, QList<PDFImage> & imgs);

        // Helper method to analyze a ColorSpace's array. They all have the form [/csType ...] (section 4.5 in PDF Spec 1.6).
        // csObject is a pointer to a PoDoFo's PdfObject which is in fact a PdfArray underneath.
        // A color space's type is returned.
        PDFColorSpace getCSType(PoDoFo::PdfObject* csObject);

        // Helper method to inspect a graphic state parameter dictionary (ExtGState subdictionary in the resource dictionary; Section 4.3.4 in PDF Spec 1.6).
        // Triggered by hitting a gs operator in the content stream.
        // extGStateObj is a pointer to a PoDoFo's PdfObject which is in fact a dictionary underneath.
        void inspectExtGStateObj(PoDoFo::PdfObject* extGStateObj, QList<PDFColorSpace> & usedColorSpaces, bool & hasTransparency, QList<PDFFont> & usedFonts, PDFGraphicState & currGS);

        // Helper method to analyze a font dictionary (section 5.4-5.8 in PDF Spec 1.6)
        // A PDFFont struct is returned containing some basic info regarding the specified font.
        PDFFont getFontInfo(PoDoFo::PdfObject* fontObj);
#endif
};
#endif