After some research I made it using standalone script, here is the solution : <!-- language: lang-py --> import os.path import sys #setting the environment variables os.environ['QGIS_PREFIX_PATH'] = r'C:/OSGeo4W64/apps/qgis' os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = r'C:/OSGEO4~1/apps/Qt5/plugins' os.environ['PATH'] += r';C:/OSGeo4W64/apps/qgis/bin;C:/OSGeo4W64/apps/Qt5/bin;C:/OSGeo4W64/apps/Python37' sys.path.extend([r'C:/OSGeo4W64/apps/qgis/python',r'C:/OSGeo4W64/apps/qgis/Python37/Lib/site-packages']) from qgis.core import * from PyQt5.QtCore import QRectF qgs = QgsApplication([], False) qgs.initQgis() shp_file = 'path_to_shapfile/file.shp' vlayer = QgsVectorLayer(shp_file, 'vlayer') QgsProject.instance().addMapLayer(vlayer,False) l = QgsPrintLayout(QgsProject.instance()) l.initializeDefaults() l.setUnits(QgsUnitTypes.LayoutMillimeters) page = l.pageCollection().pages()[0] lm = 20 # left margin tm = 32 # upper margin w, h = 900, 600 #width and height page.setPageSize(QgsLayoutSize(1189, 841)) #setting the layer style blackSymbol = QgsFillSymbol.createSimple({'color': '255,0,0,100', 'color_border': 'BLACK', 'width_border': '0.1'}) vlayer.setRenderer(QgsSingleSymbolRenderer(blackSymbol)) #adding the map to the layout theMap = QgsLayoutItemMap(l) theMap.updateBoundingRect() theMap.setRect(QRectF(lm,tm, w, h)) theMap.setPos(lm,tm) theMap.updateBoundingRect() theMap.setLayers([vlayer]) # setting the map extent theMap.setExtent(QgsRectangle(363600.0, 376800.0, 364500.0 ,377400.0)) theMap.attemptSetSceneRect(QRectF(lm,tm, w, h)) l.addItem(theMap) l.updateBounds() #exporting to pdf exporter = QgsLayoutExporter(l) pdf_settings = exporter.PdfExportSettings() exporter.exportToPdf('C:/map.pdf', pdf_settings) qgs.exitQgis() see : [PyQGIS3 developer cookbook][1] [1]: https://docs.qgis.org/3.4/pdf/en/QGIS-3.4-PyQGISDeveloperCookbook-en.pdf