Line data Source code
1 : #include <QPdfWriter> 2 : #include <QPainter> 3 : #include "convertertoqwidget.hpp" 4 : #include "convertertopdf.hpp" 5 : 6 : namespace qtreports { 7 : namespace detail { 8 : 9 5 : ConverterToPDF::ConverterToPDF( const ReportPtr & report ) : 10 : m_report( report ), 11 5 : m_dpi( 600 ) {} 12 : 13 5 : ConverterToPDF::~ConverterToPDF() {} 14 : 15 2 : bool ConverterToPDF::convert( const QString & path ) { 16 2 : return create( path ); 17 : } 18 : 19 1 : void ConverterToPDF::setDPI( int dpi ) 20 : { 21 1 : m_dpi = dpi; 22 1 : } 23 : 24 3 : int ConverterToPDF::getDPI() const 25 : { 26 3 : return m_dpi; 27 : } 28 : 29 2 : bool ConverterToPDF::create( const QString & path ) { 30 2 : if( m_report.isNull() ) { 31 0 : m_lastError = "Report is empty"; 32 0 : return false; 33 : } 34 : 35 4 : ConverterToQWidget converter( m_report ); 36 2 : bool result = converter.convert( ConverterToQWidget::WidgetType::Report ); 37 2 : if( !result ) { 38 0 : m_lastError = "Cannot convert to QWidget: " + converter.getLastError(); 39 0 : return false; 40 : } 41 : 42 4 : auto widget = converter.getQWidget(); 43 2 : widget->show(); 44 2 : widget->hide(); 45 2 : widget->resize( m_report->getSize() ); 46 : 47 4 : QPdfWriter writer( path ); 48 2 : writer.setCreator( "QReports Library" ); 49 2 : writer.setTitle( m_report->getName() ); 50 : 51 4 : QPainter painter( &writer ); 52 : 53 : //Only for Qt 5.3+ 54 : //auto pageSize = writer.pageLayout().pageSize(); 55 : //auto size = pageSize.sizePixels( m_dpi ); 56 : //auto sizeInch = pageSize.size( QPageSize::Unit::Inch ); 57 : //widget->resize( sizeInch.width() * m_dpi, sizeInch.height() * m_dpi ); 58 : //writer.setResolution( m_dpi ); 59 : 60 : //Inch 2.54, A4 inch size 8.26 x 11.69 61 2 : qreal scale = 2 * 8.26; 62 : 63 : //widget->resize( widget->width(), rect.height() / scale ); 64 2 : painter.scale( scale, scale ); 65 : 66 : /* 67 : auto height = m_printedWidget->height() * scale; 68 : auto count = static_cast< int >( std::ceil( height / rect.height() ) ); 69 : for( int i = 0; i < count; ++i ) 70 : { 71 : i != 0 ? printer->newPage() : 0; 72 : m_printedWidget->render( &painter, QPoint( 0, -i * rect.height() / scale ) ); 73 : } 74 : */ 75 : 76 2 : widget->render( &painter ); 77 : 78 2 : return true; 79 : } 80 : 81 3 : const QString ConverterToPDF::getLastError() const { 82 3 : return m_lastError; 83 : } 84 : 85 : } 86 : }