JasperReports has already been mentioned, but we use it in our Python-Qt applications WITHOUT a server or servlet (that is, without needing JasperServer or pyJasper).
So basically, instead of the server/servlet, you install the Jasper Reports Library. Then you need to create a little Java program that uses the Jasper Reports Library to generate a PDF report from serialized input, such as XML. There should be plenty of examples of this if you do a web search, and you only need to write this one time. Then you compile this Java program, with all the required libraries, into a JAR file.
At this point you can install the JasperSoft Studio and create a Jasper report template. Then in Python you can use JPype (or any other Python-to-Java library) to start a JVM, load your JAR file, call your Java function, pass it your serialized data, and specify which report template you want.
All of this is not trivial, but it's pretty straightforward. We like this solution because it provides a drag-and-drop form editor in the Qt Designer/Creator, a drag-and-drop JasperReports report designer, and the ability to generate a PDF report directly from data collected in Python. All of this uses well-supported tools and libraries, so it's unlikely this solution will fall apart in the foreseeable future.