To solve this problem I used Python with the Biopython library which had the SeqIO package I used to handle parsing the GenBank file and the GenomeDiagram package i used to handle creating the map itself. GenomeDiagram, however, can only create PDFs and a few other file formats, not bitmap image formats, so for that I used the ReportLab library which Biopython works in tandem with to export the diagram to the JPG format. Note:Biopython requires Numpy to run and ReportLab is optional(used here for bitmap capabilities)
Reference: https://biopython.org/docs/1.75/api/index.html
General overview: First I used the SeqIO package to parse the GenBank file and then fed that parsed sequence feature data into the GenomeDiagram package's featureset object, then that set into a track, and then that track into a diagram. When parsing through the feature data I checked for the features to be the CDS type because there is also one "source" type that has a range of the entire sequence so that would add one whole bar I didn't want. I also excluded the "gene" type because the matching "gene" and "CDS" types both have the same ranges so there was no point in adding them each twice. I then drew the diagram and wrote it to the file.
I chose to split my code into functions mainly because it's just a habit I've developed over time from my CS classes. I understand that it doesn't really matter in this case because this code will only run once but I decided to do it anyways.
One thing that interested me was how the ranges for the features would often overlap with the ranges for other features. This gave me the issue that sometimes one end of the bars would get obscured so it became hard to tell exactly where the features began or ended. I considered just turning my code in as it was because the labels did line up with the endpoint of each obscured section, however I didn't feel like that would be an accurate enough indicator. I spent a long time poring through the API until I realized that instead of forcing the boxes to work to my favor I could just try one of the different shapes GenomeDiagram offers. I decided to use the arrows instead of the default box. There is more control over the shape and size of the arrows than the box so I used that to my advantage and made the arrows alternating thicknesses so it would be easier to see the endpoints of the boxes. I would like to note however, that this sizing equation I made is very simple and was optimized for this specific genome and it is still possible that other sequences could have some obscured ends, however I think that my approach would work well for most other sequences.