This is now implemented and will be in the next Studio release. Thank you for the patient scoping; what you asked for is exactly what shipped.
PrintJob.SavePDF now takes an options object. Setting Conformance to PdfConformance.PdfA3B produces an archival PDF/A-3B document (ISO 19005-3), and attaching your invoice XML with the matching conformance level writes everything ZUGFeRD/Factur-X requires around it - the XMP extension schema, the embedded-file registration with the Alternative relationship, an sRGB output intent, and the rest:
Var options As New PdfSaveOptions
options.Conformance = PdfConformance.PdfA3B
options.ConformanceLevel = "EN 16931"
Var attachment As New PdfEmbeddedFile
attachment.Filename = "factur-x.xml"
attachment.Data = MemoryBlock.FromText(invoiceXML)
options.EmbeddedFiles = [attachment]
If job.SavePDF("Rechnung_2026-0042.pdf", options) Then
Print("E-invoice saved")
End If
The division of labour stays as we discussed: you keep generating the EN 16931 XML with the tooling you already trust and hand the bytes to Objo. The visual invoice pages come from your normal RenderPage drawing, unchanged, and Objo takes care of the PDF container side. Your existing single-argument SavePDF calls keep behaving exactly as before. The other profiles work too - pass BASIC, XRECHNUNG, and so on as ConformanceLevel (with xrechnung.xml as the filename for XRechnung, and PdfFileRelationship.Data for the MINIMUM and BASIC WL profiles, per the specification; Relationship defaults to Alternative, which is what the German EN 16931, BASIC, EXTENDED, and XRECHNUNG profiles require).
On conformance, which I know from other conversations is your main worry: during development I validated the output with veraPDF, which reports fully compliant PDF/A-3B with zero violations, and with the open-source Mustang validator, which accepted both the PDF container and the embedded EN 16931 XML when I embedded the official KoSIT sample invoice through the new pipeline. As always, the conformance of a finished invoice depends on the XML you supply, but the container is done properly - no third-party plugin involved.
The documentation will cover the full API when the release ships.