Is the protobuf JSON output produced by applying JsonFormat.Printer to a Daml Value identical to the canonical JSON encoding in the documenation?
No they are completely different. The JSON encoding used by the JSON API explicitly exploits type information to simplify the encoding. E.g., parties, contract id and text values are all represented as strings. The protobuf encoding (and therefore also the JSON enoding derived from that) is explicit about which daml-lf value you’re dealing with.
In that case, is there a public API to encode a Daml value using the canonical encoding?
The library is published to Maven but you are on your own wrt to usage. It’s not intended for external consumption.