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 2 : 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 4 : return true;
79 : }
80 :
81 3 : const QString ConverterToPDF::getLastError() const {
82 3 : return m_lastError;
83 : }
84 :
85 : }
86 : }
|