<div dir="ltr"><div>Hi,</div><div><br></div><div>I've setup together a quick prototype : <a href="https://github.com/olivierdalang/processingpdf">https://github.com/olivierdalang/processingpdf</a></div><div><br></div><div>It's a plugin that adds an "Export as PDF" algorithm.</div><div><div><br></div><div>You can have a look at the readme which provides a little bit more info.</div><div><br></div>

</div><div>There's a sample project including a processing model that uses the Export to PDF algorithm to showcase what's possible (requires QGIS 3.3 + PR #7864)<br></div><div><br></div><div><br></div><div>So far, I sticked to my first intuition which was to use a project as the starting point (rather than just a layout). The algorithm just allows to "override" the datasource from layers in that project. The rationale is that the project may contain relatively complex logic (atlas configuration, table joins, etc...), and that this way, everything would (hopefully) continue to work if it worked in the initial project.</div><div><br></div><div>If taking a layout as a starting point, we'd almost have to recreate projects in the processing model, which would quickly be limiting or over-complex. With "lock layers" and "lock styles", we could at least use some predefined layers, but then it's much less practical to work with and still isn't as flexible as using a whole project.</div><div><br></div><div><br></div><div>There's a few bugs in QGIS master that are a bit annoying (esp. <a href="https://issues.qgis.org/issues/19836">https://issues.qgis.org/issues/19836</a> that prevents the sample model to work in batch mode), I'll try to see if I can figure out what's happening but C++ isn't my cup of tea...</div><div><br></div><div>But besides this, no major technical limitation I think ! I've written down a few ideas for next steps in the readme (short&longer term).</div><div><br></div><div>Let me know what you think !<br></div><div><br></div><div>Olivier<br></div><div><br></div><div><br></div><div><br></div><br><div class="gmail_quote"><div dir="ltr">Le lun. 10 sept. 2018 à 11:43, Olivier Dalang <<a href="mailto:olivier.dalang@gmail.com">olivier.dalang@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Thanks Nyall for you very interesting ideas.</div><div><br></div><div>Initially, I thought of using layouts from QGIS projects rather than templates, as it makes it quite simple. You just create a normal QGIS project, setup styles, layout, enable or not atlas. The processing alg would just allows you to swap the datasource of one (or several) layers. It would make it very straightforward when using processing models embedded in the project file, and still relatively simple when using an external QGIS project.</div><div><br></div><div>But looking at it again, it seems like it would be possible to achieve exactly the same thing with .qpt with "lock layers" and "lock styles" is ticked, as styles, layers and atlas settings are all saved in the .qpt.</div><div><br></div><div>Remains the questions of the UI on how one would match input layers to existing layers in the qpt...<br></div><div><br></div><div>About the utility algorithms, am I right understanding there are not directly linked to the PDF exporting algorithm (but just general helpers) ?</div><div><br></div><div>The way forward I see is me trying to do a prototype as a python plugin (of course if you can help by reviewing, that would be awesome), and once stabilized, we can see how to move this to core (I personally am more at ease with python, but could probably try to move it to C++ if we think it's worth it and if you can mentor a little bit). That also allows to move forward without being too stressed by release dates / feature freezes (as there would be the python plugin).<br></div><div><br></div><div>So it would be nice if you could share the python code you were talking about.</div><div><br></div><div>Cheers,</div><div><br></div><div>Olivier<br></div></div><div dir="ltr"><div><br></div><br><div><br></div><div><br></div><div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">Le ven. 7 sept. 2018 à 11:27, Nyall Dawson <<a href="mailto:nyall.dawson@gmail.com" target="_blank">nyall.dawson@gmail.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, 6 Sep 2018 at 14:16, Olivier Dalang <<a href="mailto:olivier.dalang@gmail.com" target="_blank">olivier.dalang@gmail.com</a>> wrote:<br>
><br>
> Dear List,<br>
><br>
> (I took the liberty to CC in some of you that I thought may be interested by this)<br>
<br>
Count me in too -- I'm very interested here, given my history with<br>
both Print Layout and Processing work!<br>
<br>
> I'm dreaming of using the QGIS graphical modeler to output PDFs using print composers. This would allow to build very interesting report generators using our favorite tool. As far as I understand, currently, it is not possible.<br>
><br>
> I'd be interested in working to implement it, to start with as a plugin (prototype), and once this works see if we can integrate into core.<br>
><br>
> What I thought of so far is to be able to specify as inputs :<br>
> - a QGIS project [file] (using the current project if empty - esp. useful in conjunction with the great new embedded models feature)<br>
> - a composer name [string] (use the first one if empty)<br>
<br>
I've got (Python) code which allows Print Layout parameter choices<br>
(exposed as a combo box showing layouts within the current project),<br>
and a layout "map item" parameter (links to the print layout<br>
parameter, and shows a nice combo box of map items in the selected<br>
layout). I can clean this up and share, but honestly my preference<br>
would be to get this in to master as c++ code.<br>
<br>
I think ideally the "print layout" parameter would expose both layouts<br>
in the current project + a "..." file selector allowing choice of a<br>
Print Layout template file (.qpt) (this should be relatively<br>
straightforward -- basically a new temporary layout would be created<br>
using the selected qpt). Possibly we could/should have an option in<br>
that drop down to allow selection of a layout from a different project<br>
file too, but this would add considerable complexity, and I'm unsure<br>
if there's a concrete use case for this which couldn't be handled by<br>
qpt template files alone.<br>
<br>
> - N layers [layer] (I don't think we can support variable inputs count, so could be 5)<br>
> - N layer ids [string] (id of the layer in the project to be replaced by corresponding input)<br>
<br>
There's already multi layer parameters available for algorithms (which<br>
also support layer order), so these could be reused here.<br>
<br>
> Do you have some ideas about implementation ?<br>
<br>
I'd see a number of ways we could expose print layouts/atlas to<br>
Processing. Some potential algorithms could be:<br>
<br>
Exporting algorithms<br>
---------------------------<br>
- Export layout. Just does a direct export of the selected layout to a<br>
specified file. Nice and easy! [1]<br>
- Export atlas. As above, but for a pre-existing atlas and selected<br>
folder/file destination.<br>
- Something like "export layout as atlas", where users select and<br>
existing layout/qpt, map item, and "coverage layer", and the algorithm<br>
iterates over the features in that layer just like an atlas, but using<br>
a map layer generated elsewhere in the model as the coverage layer.<br>
<br>
Utility algorithms<br>
----------------------<br>
- Create layer from layout map item extent. Creates a new polygon<br>
layer with a polygon feature of the are currently visible within a<br>
selected layout map item. Handy for quickly creating a polygon layer<br>
with the exact coverage of a map item for styling or atlas creation<br>
purposes. (I've implemented this one already as a PyQGIS alg)<br>
- Create atlas feature template: After selecting a layout map item and<br>
specifying a desired "scale" and "origin point", the algorithm creates<br>
a new polygon layer with a single feature of the required size which<br>
makes the map item match the given scale [2]. The use case here is to<br>
create the feature, then "copy and move" it multiple times over the<br>
area of interest for an atlas.<br>
- Some equivalent of the ESRI "Create strip map index"  tool/QGIS<br>
PolyStrip plugin. Select a map item, desired scale, and line feature<br>
layer and the algorithm creates rotated template features along the<br>
lines to allow an atlas following the line. Options for overlap<br>
margins, max map rotation, etc.<br>
<br>
Layout creation algorithms<br>
-----------------------------------<br>
<br>
We could also have algorithms for assisting with editing/creating<br>
layouts themselves, e.g. algorithms which created grids of guides,<br>
grided layouts, etc. I'd LOVE LOVE LOVE a layout "spell check" tool!<br>
<br>
Anyway, count me in here. I'm interested in helping in whatever way<br>
desired - I can either mentor someone else to code this, or would be<br>
interested in doing it directly if there's a sponsor available.<br>
Alternatively we could write up all the desired specs and run a crowd<br>
funding campaign to raise funds!<br>
<br>
Nyall<br>
<br>
[1] Would work super-well with a potential "QGIS variable" parameter,<br>
which displays as the QGIS variable editor and which would allow<br>
tweaking of expression variables to inflence the map render<br>
[2] I'd also like to see a proper parameter widget for "scale"<br>
parameters, which uses the nice QGIS scale widget instead of just<br>
direct number entry.<br>
</blockquote></div></div></blockquote></div></div>