[poppler] poppler/qt4/src: Makefile.am, 1.19, 1.20 poppler-document.cc, 1.36, 1.37 poppler-ps-converter.cc, NONE, 1.1 poppler-qt4.h, 1.51, 1.52

Albert Astals Cid aacid at kemper.freedesktop.org
Sat Apr 28 05:00:40 PDT 2007


Update of /cvs/poppler/poppler/qt4/src
In directory kemper:/tmp/cvs-serv18589/qt4/src

Modified Files:
	Makefile.am poppler-document.cc poppler-qt4.h 
Added Files:
	poppler-ps-converter.cc 
Log Message:
        * qt4/src/Makefile.am:
        * qt4/src/poppler-document.cc:
        * qt4/src/poppler-ps-converter.cc:
        * qt4/src/poppler-qt4.h: Replace Document::print function with lots of
        arguments with a helper class with lots of functions. Will help
        mantaining BC in case we decide to add more functionality to the
        printing process.


Index: Makefile.am
===================================================================
RCS file: /cvs/poppler/poppler/qt4/src/Makefile.am,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- Makefile.am	28 Apr 2007 11:16:49 -0000	1.19
+++ Makefile.am	28 Apr 2007 12:00:38 -0000	1.20
@@ -28,6 +28,7 @@
 	../../qt/poppler-page-transition.cc	\
 	poppler-sound.cc			\
 	poppler-form.cc				\
+	poppler-ps-converter.cc			\
 	poppler-annotation-helper.h		\
 	poppler-private.h
 

Index: poppler-document.cc
===================================================================
RCS file: /cvs/poppler/poppler/qt4/src/poppler-document.cc,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -d -r1.36 -r1.37
--- poppler-document.cc	27 Apr 2007 22:41:10 -0000	1.36
+++ poppler-document.cc	28 Apr 2007 12:00:38 -0000	1.37
@@ -24,7 +24,6 @@
 #include <GlobalParams.h>
 #include <Outline.h>
 #include <PDFDoc.h>
-#include <PSOutputDev.h>
 #include <Stream.h>
 #include <Catalog.h>
 
@@ -412,39 +411,6 @@
         return ld;
     }
     
-    bool Document::print(const QString &file, const QString &title, const QList<int> &pageList, double hDPI, double vDPI, int rotate, int paperWidth, int paperHeight, int marginRight, int marginBottom, int marginLeft, int marginTop, bool strictMargins, bool forceRasterize)
-    {
-        QByteArray pstitle8Bit = title.toLocal8Bit();
-        char* pstitlechar;
-        if (!title.isEmpty()) pstitlechar = pstitle8Bit.data();
-        else pstitlechar = 0;
-
-        PSOutputDev *psOut = new PSOutputDev(file.toLatin1().data(), m_doc->doc->getXRef(), m_doc->doc->getCatalog(), pstitlechar, 1, m_doc->doc->getNumPages(), psModePS, paperWidth, paperHeight, gFalse, marginRight, marginBottom, paperWidth - marginLeft, paperHeight - marginTop, forceRasterize);
-
-        if (strictMargins)
-        {
-            double xScale = ((double)paperWidth - (double)marginLeft - (double)marginRight) / (double)paperWidth;
-            double yScale = ((double)paperHeight - (double)marginBottom - (double)marginTop) / (double)paperHeight;
-            psOut->setScale(xScale, yScale);
-        }
-
-        if (psOut->isOk())
-        {
-            foreach(int page, pageList)
-            {
-                m_doc->doc->displayPage(psOut, page, hDPI, vDPI, rotate, gFalse, gTrue, gFalse);
-            }
-
-            delete psOut;
-            return true;
-        }
-        else
-        {
-            delete psOut;
-            return false;
-        }
-    }
-    
     void Document::setPaperColor(const QColor &color)
     {
         m_doc->setPaperColor(color);
@@ -499,6 +465,11 @@
         return Document::RenderHints() & m_doc->m_hints;
     }
 
+    PSConverter *Document::psConverter() const
+    {
+        return new PSConverter(m_doc);
+    }
+
     QDateTime convertDate( char *dateString )
     {
         int year;

--- NEW FILE: poppler-ps-converter.cc ---
/* poppler-document.cc: qt interface to poppler
 * Copyright (C) 2007, Albert Astals Cid <aacid at kde.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include "poppler-qt4.h"
#include "poppler-private.h"

#include "PSOutputDev.h"

namespace Poppler {

class PSConverterData
{
	public:
		DocumentData *document;
		QString outputFileName;
		QList<int> pageList;
		QString title;
		double hDPI;
		double vDPI;
		int rotate;
		int paperWidth;
		int paperHeight;
		int marginRight;
		int marginBottom;
		int marginLeft;
		int marginTop;
		bool strictMargins;
		bool forceRasterize;
};

PSConverter::PSConverter(DocumentData *document)
{
	m_data = new PSConverterData();
	m_data->document = document;
	m_data->hDPI = 72;
	m_data->vDPI = 72;
	m_data->rotate = 0;
	m_data->paperWidth = -1;
	m_data->paperHeight = -1;
	m_data->marginRight = 0;
	m_data->marginBottom = 0;
	m_data->marginLeft = 0;
	m_data->marginTop = 0;
	m_data->strictMargins = false;
	m_data->forceRasterize = false;
}

PSConverter::~PSConverter()
{
	delete m_data;
}

void PSConverter::setOutputFileName(const QString &outputFileName)
{
	m_data->outputFileName = outputFileName;
}

void PSConverter::setPageList(const QList<int> &pageList)
{
	m_data->pageList = pageList;
}

void PSConverter::setTitle(const QString &title)
{
	m_data->title = title;
}

void PSConverter::setHDPI(double hDPI)
{
	m_data->hDPI = hDPI;
}

void PSConverter::setVDPI(double vDPI)
{
	m_data->vDPI = vDPI;
}

void PSConverter::setRotate(int rotate)
{
	m_data->rotate = rotate;
}

void PSConverter::setPaperWidth(int paperWidth)
{
	m_data->paperWidth = paperWidth;
}

void PSConverter::setPaperHeight(int paperHeight)
{
	m_data->paperHeight = paperHeight;
}

void PSConverter::setRightMargin(int marginRight)
{
	m_data->marginRight = marginRight;
}

void PSConverter::setBottomMargin(int marginBottom)
{
	m_data->marginBottom = marginBottom;
}

void PSConverter::setLeftMargin(int marginLeft)
{
	m_data->marginLeft = marginLeft;
}

void PSConverter::setTopMargin(int marginTop)
{
	m_data->marginTop = marginTop;
}

void PSConverter::setStrictMargins(bool strictMargins)
{
	m_data->strictMargins = strictMargins;
}

void PSConverter::setForceRasterize(bool forceRasterize)
{
	m_data->forceRasterize = forceRasterize;
}

bool PSConverter::convert()
{
	Q_ASSERT(!m_data->outputFileName.isEmpty());
	Q_ASSERT(!m_data->pageList.isEmpty());
	Q_ASSERT(m_data->paperWidth != -1);
	Q_ASSERT(m_data->paperHeight != -1);
	
	QByteArray pstitle8Bit = m_data->title.toLocal8Bit();
	char* pstitlechar;
	if (!m_data->title.isEmpty()) pstitlechar = pstitle8Bit.data();
	else pstitlechar = 0;
	
	PSOutputDev *psOut = new PSOutputDev(m_data->outputFileName.toLatin1().data(),
	                                     m_data->document->doc->getXRef(),
	                                     m_data->document->doc->getCatalog(),
	                                     pstitlechar,
	                                     1,
	                                     m_data->document->doc->getNumPages(),
	                                     psModePS,
	                                     m_data->paperWidth,
	                                     m_data->paperHeight,
	                                     gFalse,
	                                     m_data->marginRight,
	                                     m_data->marginBottom,
	                                     m_data->paperWidth - m_data->marginLeft,
	                                     m_data->paperHeight - m_data->marginTop,
	                                     m_data->forceRasterize);
	
	if (m_data->strictMargins)
	{
		double xScale = ((double)m_data->paperWidth - (double)m_data->marginLeft - (double)m_data->marginRight) / (double)m_data->paperWidth;
		double yScale = ((double)m_data->paperHeight - (double)m_data->marginBottom - (double)m_data->marginTop) / (double)m_data->paperHeight;
		psOut->setScale(xScale, yScale);
	}
	
	if (psOut->isOk())
	{
		foreach(int page, m_data->pageList)
		{
			m_data->document->doc->displayPage(psOut, page, m_data->hDPI, m_data->vDPI, m_data->rotate, gFalse, gTrue, gFalse);
		}
		
		delete psOut;
		return true;
	}
	else
	{
		delete psOut;
		return false;
	}
}

}

Index: poppler-qt4.h
===================================================================
RCS file: /cvs/poppler/poppler/qt4/src/poppler-qt4.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- poppler-qt4.h	28 Apr 2007 11:34:14 -0000	1.51
+++ poppler-qt4.h	28 Apr 2007 12:00:38 -0000	1.52
@@ -47,6 +47,8 @@
 
     class TextBoxData;
 
+    class PSConverter;
+
     /**
         Describes the physical location of text on a document page
        
@@ -714,24 +716,6 @@
 	LinkDestination *linkDestination( const QString &name );
 	
 	/**
-	  Prints the document to the PostScript file \p fileName
-	  Sizes have to be in Points (1/72 inch)
-	  \param strictMargins defines if margins have to be scrictly
-	                       followed (even if that means changing aspect ratio) or
-	                       if the margins can be adapted to keep aspect ratio
-
-	  If you are using QPrinter you can get paper size by doing:
-	  \code
-QPrinter dummy(QPrinter::PrinterResolution);
-dummy.setFullPage(true);
-dummy.setPageSize(myPageSize);
-width = dummy.width();
-height = dummy.height();
-	  \endcode
-	*/
-	bool print(const QString &fileName, const QString &title, const QList<int> &pageList, double hDPI, double vDPI, int rotate, int paperWidth, int paperHeight, int marginRight, int marginBottom, int marginLeft, int marginTop, bool strictMargins, bool forceRasterize);
-	
-	/**
 	  Sets the paper color
 
 	  \param color the new paper color
@@ -772,6 +756,11 @@
 	  The currently set render hints.
 	 */
 	RenderHints renderHints() const;
+	
+	/**
+	  Gets a PS converter of this document. The pointer has to be freed by the calling application.
+	 */
+	PSConverter *psConverter() const;
 
 	~Document();
   
@@ -781,6 +770,100 @@
 	Document(DocumentData *dataA);
 	static Document *checkDocument(DocumentData *doc);
     };
+    
+    /**
+       Converts a PDF to PS
+
+       Sizes have to be in Points (1/72 inch)
+
+       If you are using QPrinter you can get paper size by doing:
+       \code
+           QPrinter dummy(QPrinter::PrinterResolution);
+           dummy.setFullPage(true);
+           dummy.setPageSize(myPageSize);
+           width = dummy.width();
+           height = dummy.height();
+       \endcode
+    */
+    class PSConverterData;
+    class PSConverter
+    {
+        friend class Document;
+        public:
+            ~PSConverter();
+
+            /** Sets the output file name. Mandatory. */
+            void setOutputFileName(const QString &outputFileName);
+
+            /** Sets the list of pages to print. Mandatory. */
+            void setPageList(const QList<int> &pageList);
+
+            /**
+              Sets the title of the PS Document. Optional
+            */
+            void setTitle(const QString &title);
+
+            /**
+              Sets the horizontal DPI. Defaults to 72.0
+            */
+            void setHDPI(double hDPI);
+
+            /**
+              Sets the vertical DPI. Defaults to 72.0
+            */
+            void setVDPI(double vDPI);
+
+            /**
+              Sets the rotate. Defaults to not rotated
+            */
+            void setRotate(int rotate);
+
+            /**
+              Sets the output paper width. Has to be set.
+            */
+            void setPaperWidth(int paperWidth);
+
+            /**
+              Sets the output paper height. Has to be set.
+            */
+            void setPaperHeight(int paperHeight);
+
+            /**
+              Sets the output right margin. Defaults to 0
+            */
+            void setRightMargin(int marginRight);
+
+            /**
+              Sets the output bottom margin. Defaults to 0
+            */
+            void setBottomMargin(int marginBottom);
+
+            /**
+              Sets the output left margin. Defaults to 0
+            */
+            void setLeftMargin(int marginLeft);
+
+            /**
+              Sets the output top margin. Defaults to 0
+            */
+            void setTopMargin(int marginTop);
+
+            /** Defines if margins have to be scrictly
+                followed (even if that means changing aspect ratio) or
+                if the margins can be adapted to keep aspect ratio. Defaults to false. */
+            void setStrictMargins(bool strictMargins);
+
+            /** Defines if the page will be rasterized to an image before printing. Defaults to false */
+            void setForceRasterize(bool forceRasterize);
+
+            /** Does the conversion */
+            bool convert();
+
+        private:
+            PSConverter(DocumentData *document);
+
+            PSConverterData *m_data;
+    };
 
     /**
        Conversion from PDF date string format to QDateTime



More information about the poppler mailing list