-
Notifications
You must be signed in to change notification settings - Fork 299
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PDF Generation Alternative - GSoC #2132
PDF Generation Alternative - GSoC #2132
Conversation
care/templates/reports/patient_discharge_summary_pdf_template.typ
Outdated
Show resolved
Hide resolved
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #2132 +/- ##
===========================================
- Coverage 64.21% 64.20% -0.02%
===========================================
Files 239 241 +2
Lines 13495 13582 +87
Branches 1917 1940 +23
===========================================
+ Hits 8666 8720 +54
- Misses 4472 4502 +30
- Partials 357 360 +3 ☔ View full report in Codecov by Sentry. |
@sainak @DraKen0009 the discharge summary is not generating and the test is failing in the PR as well |
|
|
LGTM @DraKen0009 nice work |
Documentation link
https://docs.ohc.network/docs/care/CEP/Completed/pdf-generation
Associated Issue
Merge Checklist
Proposal Preface
Care is currently using
django-hardcopy
to generate discharge reports, which utilizes Chromium Headless for rendering Django templates in Chrome and converting them to PDF. However, this method is not very efficient and could be improved by using a native Python package that can directly convert HTML to PDF without the need for browser rendering. This would result in lower resource consumption and increased efficiency.Currently, this function is responsible for generating PDFs, and the following is the Django template used for generating reports using Tailwind CSS and Django templates.
Drawbacks of Current Approach
django-hardcopy
, last seen in July 2018, has raised concerns regarding possible security vulnerabilities.Proposed Solution
Initial Solution Approach
Initially, I considered utilizing a Python library like
WeasyPrint
orxhtml2pdf
. Both libraries offer Django-friendly code. Here are the respective documentation links for further reference:After conducting further research and receiving feedback, I came across a recent article by Zerodha that discussed PDF generation. This is where I discovered Typst.
Final Solution (Using Typst)
Initially, PDFs were generated from HTML using Puppeteer, which involved spawning headless instances of Chrome. According to the Zerodha article, their earlier tech stack, similar to ours, relied on headless Chrome for PDF rendering, which proved inefficient at scale. However, they transitioned to Typst, noting its efficiency and scalability benefits. This sparked my interest, leading to extensive research validating Typst's effectiveness and credibility through various references.
We can also refer to the official documentation, to get detailed information related to the tool.
I engaged with the Typst community and moderators on Discord, where I received predominantly positive feedback and had productive interactions. The notable advantage I found with Typst is its freshness compared to competitors like LaTeX. While it may have fewer available resources for reference, my experience within the Typst community has been positive. The community is extremely helpful and responsive, making any potential lack of resources a minor concern.
By adopting Typst for our PDF generation needs, we can significantly improve the efficiency and scalability of our discharge report generation process, ensuring lower resource consumption and enhanced performance.
Implementation Plan
Step 1: Update Docker Files to Add Typst Dependencies
Step 2: Update Helper Functions for Typst and Create a Wrapper for Typst to Compile Templates
Step 3: Create a Static Template for Our Report
Step 4: Integrate Typst with Django Templates in Our Project
Step 5: Create Tests
Step 6: Remove All Previous Dependencies and Remove Chromium and django-hardcopy
Step 7: Update production files for the changes
Step 1: Update Docker Files to Add Typst Dependencies
Since we don't have an apt installation for Typst, we can download it from the official releases according to the build we are working on. Updated Dockerfile : dev.Dockerfile
Step 2: Update Helper Functions and Create Typst Wrapper
First of all we have to create a wrapper function to allow our typ binary to compile our template. The updated function - compile_typ
After creating a wrapper we can update our helper functions. Updated helper function - generate_discharge_summary_pdf
Step 3: Create Static Template for Reports
Static Report Template progress could be seen here - Report Template.
Now this document just contains different components that I've used in the template.
Step 4: Integrate Typst with Django Templates in Our Project
Updated the previous template using HTML/CSS with
Typst
. Template can be at patient_discharge_summary_pdf_template.typStep 5: Create Tests
Generating
PNG
of the pdf using typst and comparing usingPillow
library. It involves have sample png images of the pdf incare/facility/tests/sample_reports
folder which are to be compared with the newly generated pdf pngs , if identical the test cases passes, else throws error.To Update the sample
PNG
files, we can update the test_compile_typ function by adding the below code to test function below line 59.To investigate any errors, we can remove the finally block from our test_compile_typ. It'll generate the
test_output{n}.png
files incare/facility/tests/sample_reports
folder, from where you can use image diff checker to investigate the differences.if in future we decide to add more data to the test function and the number of pages increases, then one should also update the number_of_pngs_generated number to the number of pages of pdf generated.
Step 6: Remove All Previous Dependencies and Remove Chromium and django-hardcopy
Updated all the functions utilising the older dependencies with the newer versions and removed
django-hardcopy
from pipfile andchromium
from docker file.Step 7: Update production files for the changes
Updated prod.Dockerfile to remove older dependencies and added newer dependencies.
Updates in the template are listed below
Patient Detail section
Date of Birth
fieldAdmission Details Section
Decision After Consultation
fieldExamination details and Clinical conditions
fieldFrom
fieldDuration of Admission
field , which shows the time span the patient was admitted (discharge date - encounter date)Admitted to
field , which shows the bed and it's typeDiagnosis at admission
field which shows List the ICD-11 in the following order - confirmed,provisional, unconfirmed, differentialReported Allergies
field, which shows the list of allergiesSymptoms at admission
field ,which show list of all active symptoms at the time of admissionHealth Insurance Details
Treatment Summary Section
Prescriptions
medication details into a single table with updated formatTreatment Plan
General Instructions
Special Instructions
Prescription notes
it is not relevant for discharge summaryDischarge Summary Section
Discharge Notes
toDischarge Advice
Discharge Prescription
tableOthers
Symptoms
andDiagnosis (ICD-11)
tables andHealth Status at admission
sectionDaily Round
sectiontemplatetags
, one toformat prescription
, one toformat_to_sentence_case
and one tohandle empty data
Results
Links