I want to make abstract of poster presentation with JIC 2027 – Scientific Poster Presentation Guidelines 1. Poster Presentation Format Parameter Guidelines Orientation Vertical (Portrait) Height 6.50 feet (2 metres) Width 3.28 feet (1 metre) Language English Abstract length 250–300 words Abstract font Times New Roman Abstract font size 11 points Mandatory poster footer The following statement must be printed at the bottom of the poster: “Poster presented at JIC 2027, Ahmedabad, India.” 1. Abstract Structure The abstract must contain the following sections: For clinical studies: 1. Background 2. Method 3. Results 4. Conclusion For clinical case studies: 1. Case History 2. Diagnosis 3. Management 4. Discussion 5. Outcome Abstract requirements: * 250–300 words. * Font: Times New Roman. * Font size: 11 points. * Must be written in English. * Research should not have been presented earlier. 1. Important Checklist Before Submission Requirement Details ☐ Prepare abstract of 250–300 words ☐ Use Times New Roman, 11-point font ☐ Include all required abstract sections ☐ Ensure research has not been presented previously ☐ Submit before 30 November 2026 ☐ Pay ₹1,000 submission fee ☐ Prepare vertical poster (6.5 × 3.28 feet) ☐ Include mandatory footer ☐ Prepare maximum 6 slides for Grand Jury ☐ Prepare a 6-minute presentation My recommendation for preparing a competitive medical poster For a clinical research poster, I recommend the following layout: 1. Title and Authors 2. Introduction / Background 3. Aim and Objectives 4. Materials and Methods 5. Results – tables, graphs and charts 6. Discussion 7. Conclusion 8. References 9. Acknowledgement
Which part should I go into in detail first?
This is patient detail for which we have to make abstract
"granulomatosis with polyangiitis"[MeSH Terms] AND "rituximab"
mkdir -p /tmp/workspace/jic2027-abstract && cat > /tmp/workspace/jic2027-abstract/abs.py << 'EOF' sections = [ ("Case History", "A 29-year-old male tobacco chewer with no comorbidities presented in March 2026 with epistaxis, nasal crusting, fever, weight loss, fatigue, left knee arthritis and haematuria. Hb was 8.8 g/dL, ESR 85 mm/h and CRP 345 mg/L. Urine showed 10-12 RBC/hpf. CECT thorax revealed diffuse nodular infiltrates and consolidation with necrotizing areas in the right upper, right middle and bilateral lower lobes."), ("Diagnosis", "PR3-ANCA was strongly positive (ELISA 72; cut-off 3). Sputum CBNAAT for tuberculosis and Coombs test were negative, and CT of paranasal sinuses was normal. Granulomatosis with polyangiitis (GPA) was diagnosed, with pulmonary, musculoskeletal and upper airway involvement."), ("Management", "Induction began on 21 March 2026 with intravenous cyclophosphamide 500 mg every 15 days. After three doses, he developed dry cough, exertional dyspnoea, haematuria and bilateral crepitations. Hb fell to 8.3 g/dL, CRP was 150 mg/L, ESR 118 mm/h, and HRCT showed diffuse ground-glass opacities with consolidation. A flare during induction was diagnosed. Rituximab 1 g replaced the fourth cyclophosphamide dose on 15 May 2026, with methylprednisolone 500 mg for three days followed by tapering oral prednisolone. The second rituximab 1 g dose was given on 1 June 2026."), ("Discussion", "Rituximab with glucocorticoids is non-inferior to cyclophosphamide for remission induction in severe ANCA-associated vasculitis, and is preferred in refractory or relapsing disease. Disease flare eight weeks into cyclophosphamide, with lung involvement and anaemia of chronic disease (low iron, ferritin 462 ng/mL), shows the need for early reassessment of disease activity and a prompt change of agent."), ("Outcome", "Chest opacities resolved on repeat radiograph two days after treatment. At five months (October 2026) he was asymptomatic, with SpO2 98% on room air, Hb 10.2 g/dL, ESR 40 mm/h and CRP 4.1 mg/L. Creatinine 1.15 mg/dL and 1+ proteinuria remain under surveillance. He continues azathioprine 50 mg twice daily and low-dose prednisolone, with maintenance rituximab 500 mg planned for 1 December 2026."), ] import re tot=0 for h,t in sections: n=len(t.split()); tot+=n; print(h,n) print("body",tot) print("with headings", tot+sum(len(h.split()) for h,_ in sections)) from docx import Document from docx.shared import Pt from docx.oxml.ns import qn d=Document() st=d.styles['Normal']; st.font.name='Times New Roman'; st.font.size=Pt(11) st.element.rPr.rFonts.set(qn('w:eastAsia'),'Times New Roman') p=d.add_paragraph(); r=p.add_run("Flare of PR3-ANCA Granulomatosis with Polyangiitis during Cyclophosphamide Induction: Rapid Response to Rituximab and Pulse Methylprednisolone"); r.bold=True for h,t in sections: p=d.add_paragraph(); r=p.add_run(h+": "); r.bold=True; p.add_run(t) p.paragraph_format.space_after=Pt(4) d.save("/tmp/workspace/jic2027-abstract/JIC2027_GPA_Case_Abstract.docx") EOF python3 /tmp/workspace/jic2027-abstract/abs.py
cat > /tmp/workspace/jic2027-abstract/abs2.py << 'EOF' title="Flare of PR3-ANCA Granulomatosis with Polyangiitis during Cyclophosphamide Induction: Rapid Response to Rituximab and Pulse Methylprednisolone" sections = [ ("Case History", "A 29-year-old male tobacco chewer with no comorbidities presented in March 2026 with epistaxis, nasal crusting, fever, weight loss, left knee arthritis and haematuria. Hb was 8.8 g/dL, ESR 85 mm/h, CRP 345 mg/L; urine showed 10-12 RBC/hpf. CECT thorax revealed diffuse nodular infiltrates and consolidation with necrotizing areas in the right upper, right middle and both lower lobes."), ("Diagnosis", "PR3-ANCA was strongly positive (ELISA 72; cut-off 3). Sputum CBNAAT for tuberculosis and Coombs test were negative; sinus CT was normal. Granulomatosis with polyangiitis (GPA) was diagnosed, with pulmonary, musculoskeletal and upper airway involvement."), ("Management", "Induction began on 21 March 2026 with intravenous cyclophosphamide 500 mg every 15 days. After three doses he developed dry cough, exertional dyspnoea, haematuria and bilateral crepitations. Hb fell from 11.4 to 9.2 g/dL, CRP was 150 mg/L, ESR 118 mm/h, and HRCT showed diffuse ground-glass opacities with consolidation, indicating flare. Rituximab 1 g replaced the fourth cyclophosphamide dose on 15 May 2026, with methylprednisolone 500 mg for three days, then tapering prednisolone. A second rituximab 1 g dose followed on 1 June 2026."), ("Discussion", "Rituximab with glucocorticoids is non-inferior to cyclophosphamide for remission induction in severe ANCA-associated vasculitis and is preferred in refractory disease. Flare eight weeks into cyclophosphamide, with lung involvement and anaemia of chronic disease (low iron, ferritin 462 ng/mL), highlights the need for early reassessment and prompt change of agent."), ("Outcome", "Chest opacities resolved on repeat radiograph two days later. At five months (October 2026) he was asymptomatic, with SpO2 98% on room air, Hb 10.2 g/dL, ESR 40 mm/h and CRP 4.1 mg/L. Creatinine 1.15 mg/dL and 1+ proteinuria remain under surveillance. He continues azathioprine 50 mg twice daily and low-dose prednisolone; maintenance rituximab 500 mg is planned for 1 December 2026."), ] tot=0 for h,t in sections: n=len(t.split()); tot+=n; print(h,n) hd=sum(len(h.split()) for h,_ in sections) print("body",tot,"with headings",tot+hd,"with title",tot+hd+len(title.split())) from docx import Document from docx.shared import Pt from docx.oxml.ns import qn d=Document() st=d.styles['Normal']; st.font.name='Times New Roman'; st.font.size=Pt(11) st.element.rPr.rFonts.set(qn('w:eastAsia'),'Times New Roman') p=d.add_paragraph(); r=p.add_run(title); r.bold=True for h,t in sections: p=d.add_paragraph(); r=p.add_run(h+": "); r.bold=True; p.add_run(t) p.paragraph_format.space_after=Pt(4) d.save("/tmp/workspace/jic2027-abstract/JIC2027_GPA_Case_Abstract.docx") EOF python3 /tmp/workspace/jic2027-abstract/abs2.py; ls -la /tmp/workspace/jic2027-abstract/
JIC2027 GPA Case Abstract
Word Document · DOCX
Add information from this ppt and decrease management part and increase history part .
cd /tmp/workspace/attachments/05f23df2-e041-4458-9e30-82e66411fa9f/ && python3 -c " from pptx import Presentation p=Presentation('Clinical_Case_GPA.pptx') for i,s in enumerate(p.slides,1): print('--- slide',i) for sh in s.shapes: if sh.has_text_frame: t=sh.text_frame.text.strip() if t: print(t) if sh.has_table: for r in sh.table.rows: print(' | '.join(c.text for c in r.cells)) if sh.shape_type==13: print('[picture]',sh.name) if s.has_notes_slide: print('NOTES:',s.notes_slide.notes_text_frame.text) "
cat > /tmp/workspace/jic2027-abstract/abs3.py << 'EOF' title="Flare of PR3-ANCA Granulomatosis with Polyangiitis during Cyclophosphamide Induction: Rapid Response to Rituximab and Pulse Methylprednisolone" sections = [ ("Case History", "A 29-year-old male driver from Surendranagar, a tobacco chewer with recurrent otitis media and sensorineural hearing loss, presented in March 2026 with 20 days of giddiness, weakness, low-grade fever and anorexia, 15 days of cough with haemoptysis and epistaxis, 2-3 kg weight loss, and 100 days of left knee pain and swelling. Examination showed bilateral conjunctival injection, a dark nasal crust, and bilateral knee swelling (left more than right) with left effusion. Rash, sicca symptoms, genital ulcers and small joint pain were absent. Hb was 9.9 g/dL, WBC 17,460/µL, platelets 795,000/µL, CRP 303.9 mg/L, ESR 85 mm/h and ferritin above 1850 ng/mL. Urine showed 10-12 RBC/hpf, ACR 40.7 mg/g. CECT thorax revealed diffuse nodular infiltrates and consolidation with necrotizing areas. Ultrasound showed a left pleural effusion and left popliteal partial thrombus."), ("Diagnosis", "PR3-ANCA was strongly positive (72 IU/mL; reference below 3). ANA, hepatitis B and C, dengue, Widal, blood and urine cultures and sputum CBNAAT were negative. Echocardiography showed EF 60% and RVSP 22 mmHg. Granulomatosis with polyangiitis (GPA) was diagnosed, with upper airway, ear, eye, lung, joint and probable renal involvement."), ("Management", "Cyclophosphamide 500 mg fortnightly began on 21 March 2026. After three doses he flared with cough, dyspnoea and crepitations; Hb fell from 11.4 to 9.2 g/dL, CRP was 150 mg/L, and HRCT showed ground-glass opacities. Rituximab 1 g (15 May and 1 June 2026) and methylprednisolone 500 mg for three days, then tapering prednisolone, were given."), ("Discussion", "Ear involvement should not be dismissed as coincidental in ANCA-positive multisystem disease. Rituximab with glucocorticoids is non-inferior to cyclophosphamide for induction and is preferred in refractory disease. Flare eight weeks into cyclophosphamide shows the need for early reassessment and prompt change of agent."), ("Outcome", "Chest opacities resolved within two days. At five months he was asymptomatic (SpO2 98%), with Hb 10.2 g/dL, ESR 40 mm/h and CRP 4.1 mg/L; creatinine 1.15 mg/dL and 1+ proteinuria are monitored. On azathioprine and low-dose prednisolone, maintenance rituximab 500 mg is planned for 1 December 2026."), ] tot=0 for h,t in sections: n=len(t.split()); tot+=n; print(h,n) hd=sum(len(h.split()) for h,_ in sections) print("body",tot,"with headings",tot+hd,"with title",tot+hd+len(title.split())) from docx import Document from docx.shared import Pt from docx.oxml.ns import qn d=Document() st=d.styles['Normal']; st.font.name='Times New Roman'; st.font.size=Pt(11) st.element.rPr.rFonts.set(qn('w:eastAsia'),'Times New Roman') p=d.add_paragraph(); r=p.add_run(title); r.bold=True for h,t in sections: p=d.add_paragraph(); r=p.add_run(h+": "); r.bold=True; p.add_run(t) p.paragraph_format.space_after=Pt(4) d.save("/tmp/workspace/jic2027-abstract/JIC2027_GPA_Case_Abstract_v2.docx") EOF python3 /tmp/workspace/jic2027-abstract/abs3.py
cd /tmp/workspace/jic2027-abstract && python3 - << 'EOF' import re s=open('abs3.py').read() start=s.index('sections = ['); end=s.index(']\ntot=0')+1 new='''sections = [ ("Case History", "A 29-year-old male driver from Surendranagar, a tobacco chewer with recurrent otitis media and sensorineural hearing loss, presented in March 2026 with 20 days of giddiness, weakness, fever and anorexia, 15 days of cough with haemoptysis and epistaxis, weight loss, and 100 days of left knee pain and swelling. Examination showed bilateral conjunctival injection, a dark nasal crust and bilateral knee swelling with left effusion. Rash, sicca symptoms, genital ulcers and small joint pain were absent. Hb was 9.9 g/dL, CRP 303.9 mg/L, ESR 85 mm/h and ferritin above 1850 ng/mL; urine showed 10-12 RBC/hpf. CECT thorax revealed nodular infiltrates and consolidation with necrotizing areas. Ultrasound showed left pleural effusion and left popliteal partial thrombus."), ("Diagnosis", "PR3-ANCA was strongly positive (72 IU/mL; reference below 3). ANA, hepatitis B and C, dengue, Widal, cultures and sputum CBNAAT were negative. Granulomatosis with polyangiitis (GPA) was diagnosed, with upper airway, ear, eye, lung, joint and probable renal involvement."), ("Management", "Cyclophosphamide 500 mg fortnightly began on 21 March 2026. After three doses he flared with cough, dyspnoea and crepitations; Hb fell to 9.2 g/dL, CRP was 150 mg/L, and HRCT showed ground-glass opacities. Rituximab 1 g (15 May, 1 June 2026) and methylprednisolone 500 mg for three days, then tapering prednisolone, were given."), ("Discussion", "Ear involvement should not be dismissed as coincidental in ANCA-positive multisystem disease. Rituximab with glucocorticoids is non-inferior to cyclophosphamide for induction and is preferred in refractory disease. Flare eight weeks into cyclophosphamide warrants early reassessment and prompt change of agent."), ("Outcome", "Chest opacities resolved within two days. At five months he was asymptomatic (SpO2 98%), with Hb 10.2 g/dL, ESR 40 mm/h and CRP 4.1 mg/L; creatinine 1.15 mg/dL and 1+ proteinuria are monitored. On azathioprine and low-dose prednisolone, maintenance rituximab 500 mg is planned for 1 December 2026."), ]''' open('abs4.py','w').write(s[:start]+new+s[end:]) EOF python3 abs4.py; ls /tmp/workspace/jic2027-abstract/*.docx
cd /tmp/workspace/jic2027-abstract && python3 - << 'EOF' s=open('abs4.py').read() s=s.replace("driver from Surendranagar, a tobacco","driver, a tobacco") s=s.replace("Rash, sicca symptoms, genital ulcers and small joint pain were absent.","Rash, sicca symptoms and genital ulcers were absent.") s=s.replace("Hb fell to 9.2 g/dL, CRP was 150 mg/L,","CRP was 150 mg/L,") s=s.replace("JIC2027_GPA_Case_Abstract_v2.docx","JIC2027_GPA_Case_Abstract_v2.docx") open('abs5.py','w').write(s) EOF python3 abs5.py && python3 -c " from docx import Document d=Document('/tmp/workspace/jic2027-abstract/JIC2027_GPA_Case_Abstract_v2.docx') print(d.styles['Normal'].font.name,d.styles['Normal'].font.size.pt)"
JIC2027 GPA Case Abstract v2
Word Document · DOCX
Design the 2 m x 1 m vertical poster with mandatory footer
mkdir -p /tmp/workspace/jic2027-poster/assets && cd /tmp/workspace/jic2027-poster && python3 - << 'EOF' from pptx import Presentation p=Presentation('/tmp/workspace/attachments/05f23df2-e041-4458-9e30-82e66411fa9f/Clinical_Case_GPA.pptx') for i,s in enumerate(p.slides,1): for sh in s.shapes: if sh.shape_type==13: im=sh.image fn=f'assets/s{i}_{sh.name.replace(" ","_")}.{im.ext}' open(fn,'wb').write(im.blob) from PIL import Image print(fn, Image.open(fn).size, sh.crop_left, sh.crop_right, sh.crop_top, sh.crop_bottom) EOF fc-list | grep -iE "liberation|dejavu|arial|helvet|open|roboto|noto" | head -20; python3 -c "import fitz;print('fitz ok')"; python3 -c "import reportlab;print(reportlab.Version)"
which pdftoppm; python3 -c "import pypdfium2;print('pdfium ok')"; python3 -c "import pdf2image;print('pdf2image ok')"; python3 -c "import matplotlib;print(matplotlib.__version__)"
mkdir -p /tmp/workspace/jic2027-poster/src /tmp/workspace/jic2027-poster/output && cd /tmp/workspace/jic2027-poster && cat > src/chart.py << 'EOF' import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import matplotlib.dates as mdates from matplotlib.gridspec import GridSpec from datetime import date as D NAVY="#12355B"; TEAL="#1B7F8C"; RED="#B23A48"; GOLD="#E0A100"; GREY="#5B6B7A" W_CM, H_CM = 91.6, 40.0 plt.rcParams.update({"font.size":26, "axes.linewidth":2}) fig = plt.figure(figsize=(W_CM/2.54, H_CM/2.54)) gs = GridSpec(3,1,height_ratios=[1.25,1.5,1.0], hspace=0.10, left=0.15, right=0.985, top=0.985, bottom=0.075) ax1=fig.add_subplot(gs[0]); ax2=fig.add_subplot(gs[1],sharex=ax1); ax3=fig.add_subplot(gs[2],sharex=ax1) x0,x1 = D(2026,3,8), D(2026,12,20) def num(d): return mdates.date2num(d) # ---- Panel A: treatment ax1.set_ylim(-0.6,3.7); ax1.set_yticks([3,2,1,0]) ax1.set_yticklabels(["Cyclophosphamide","Rituximab","Steroids","Azathioprine"], fontsize=27, fontweight="bold", color=NAVY) def bar(y,a,b,c): ax1.barh(y, num(b)-num(a), left=num(a), height=0.5, color=c, edgecolor="none", zorder=3) bar(3,D(2026,3,21),D(2026,4,30),TEAL) ax1.text(num(D(2026,5,4)),3,"500 mg x 3 doses (21 Mar to 30 Apr)",va="center",fontsize=24,color=TEAL,fontweight="bold") for d,lab in [(D(2026,5,15),""),(D(2026,6,1),"")]: ax1.plot(num(d),2,marker="D",ms=26,color=RED,zorder=4) ax1.text(num(D(2026,6,8)),2,"1 g on 15 May and 1 Jun",va="center",fontsize=24,color=RED,fontweight="bold") ax1.plot(num(D(2026,12,1)),2,marker="D",ms=26,mfc="white",mec=RED,mew=4,zorder=4) ax1.text(num(D(2026,11,26)),2,"500 mg planned 1 Dec",va="center",ha="right",fontsize=24,color=RED,fontweight="bold") bar(1,D(2026,5,15),D(2026,5,18),RED) ax1.text(num(D(2026,5,11)),1,"MPS 500 mg x 3 d",va="center",ha="right",fontsize=24,color=RED,fontweight="bold") bar(1,D(2026,5,18),D(2026,10,30),"#8FB8C4") ax1.text(num(D(2026,5,26)),1,"Prednisolone taper (40 mg to 5 / 2.5 mg alternate days)",va="center",fontsize=24,color=NAVY,fontweight="bold",zorder=5) bar(0,D(2026,10,30),D(2026,12,15),GREY) ax1.text(num(D(2026,10,26)),0,"50 mg twice daily",va="center",ha="right",fontsize=24,color=GREY,fontweight="bold") ax1.set_title("") ax1.tick_params(axis="x",labelbottom=False,length=0) ax1.tick_params(axis="y",length=0) for s in ["top","right"]: ax1.spines[s].set_visible(False) # ---- Panel B: CRP and ESR crp=[(D(2026,3,23),303.9),(D(2026,4,29),73),(D(2026,5,14),84),(D(2026,5,15),150),(D(2026,5,17),121),(D(2026,9,30),36),(D(2026,10,28),4.1)] esr=[(D(2026,3,23),85),(D(2026,4,29),67),(D(2026,5,14),118),(D(2026,9,30),44),(D(2026,10,28),40)] ax2.plot([num(d) for d,_ in crp],[v for _,v in crp],"-o",color=RED,lw=5,ms=16,label="CRP (mg/L)",zorder=4) ax2.plot([num(d) for d,_ in esr],[v for _,v in esr],"-s",color=NAVY,lw=5,ms=16,label="ESR (mm/h)",zorder=4) def lab(ax,d,v,t,dx,dy,c,ha="center"): ax.annotate(t,(num(d),v),xytext=(dx,dy),textcoords="offset points",fontsize=25,color=c,fontweight="bold",ha=ha,va="center") lab(ax2,D(2026,3,23),303.9,"303.9",0,34,RED) lab(ax2,D(2026,3,23),85,"85",0,-36,NAVY) lab(ax2,D(2026,4,29),73,"73",-8,40,RED) lab(ax2,D(2026,4,29),67,"67",0,-40,NAVY) lab(ax2,D(2026,5,14),118,"118",-52,10,NAVY) lab(ax2,D(2026,5,15),150,"150",46,18,RED) lab(ax2,D(2026,9,30),36,"36",0,-38,RED) lab(ax2,D(2026,9,30),44,"44",0,36,NAVY) lab(ax2,D(2026,10,28),4.1,"4.1",0,-38,RED) lab(ax2,D(2026,10,28),40,"40",0,36,NAVY) ax2.set_ylim(-35,350); ax2.set_yticks([0,100,200,300]) ax2.set_ylabel("CRP / ESR",fontsize=27,fontweight="bold",color=NAVY) ax2.legend(loc="upper right",fontsize=25,frameon=False,ncol=2,bbox_to_anchor=(1.0,1.02)) ax2.tick_params(axis="x",labelbottom=False,length=0) for s in ["top","right"]: ax2.spines[s].set_visible(False) ax2.grid(axis="y",color="#D9E2EA",lw=1.5,zorder=0) # ---- Panel C: Hb hb=[(D(2026,3,23),9.9),(D(2026,3,28),8.8),(D(2026,4,29),11.4),(D(2026,5,14),9.2),(D(2026,5,17),8.3),(D(2026,9,30),9.5),(D(2026,10,28),10.2)] ax3.plot([num(d) for d,_ in hb],[v for _,v in hb],"-o",color=TEAL,lw=5,ms=16,zorder=4) lab(ax3,D(2026,3,23),9.9,"9.9",-8,36,TEAL) lab(ax3,D(2026,3,28),8.8,"8.8",36,-30,TEAL) lab(ax3,D(2026,4,29),11.4,"11.4",0,36,TEAL) lab(ax3,D(2026,5,14),9.2,"9.2",-48,10,TEAL) lab(ax3,D(2026,5,17),8.3,"8.3",44,-24,TEAL) lab(ax3,D(2026,9,30),9.5,"9.5",0,-36,TEAL) lab(ax3,D(2026,10,28),10.2,"10.2",0,36,TEAL) ax3.set_ylim(7.3,12.6); ax3.set_yticks([8,10,12]) ax3.set_ylabel("Hb (g/dL)",fontsize=27,fontweight="bold",color=NAVY) ax3.grid(axis="y",color="#D9E2EA",lw=1.5,zorder=0) for s in ["top","right"]: ax3.spines[s].set_visible(False) ax3.xaxis.set_major_locator(mdates.MonthLocator()) ax3.xaxis.set_major_formatter(mdates.DateFormatter("%b")) ax3.tick_params(axis="x",labelsize=26,length=8,width=2) ax3.set_xlabel("2026",fontsize=27,fontweight="bold",color=NAVY) ax1.set_xlim(num(x0),num(x1)) # flare shading for ax in (ax1,ax2,ax3): ax.axvspan(num(D(2026,5,14)),num(D(2026,5,18)),color="#F6D5D9",zorder=1) ax1.text(num(D(2026,5,16)),3.55,"FLARE",ha="center",va="center",fontsize=24,color=RED,fontweight="bold") # panel letters for ax,t in [(ax1,"A Treatment"),(ax2,"B Inflammatory markers"),(ax3,"C Haemoglobin")]: ax.text(num(D(2026,7,20)),1.0 if ax is not ax1 else 3.6, "",) fig.text(0.152,0.985,"",) fig.savefig("assets/course_chart.png",dpi=150) print("ok") EOF python3 src/chart.py && python3 -c " from PIL import Image im=Image.open('/tmp/workspace/jic2027-poster/assets/course_chart.png');print(im.size) im.resize((im.width//5,im.height//5)).save('/tmp/workspace/jic2027-poster/assets/chart_prev.png')"
cd /tmp/workspace/jic2027-poster && sed -i 's/ax1.set_ylim(-0.6,3.7)/ax1.set_ylim(-0.6,4.05)/; s/3.55,"FLARE"/3.75,"FLARE"/; s/ax2.set_ylim(-35,350)/ax2.set_ylim(-60,350)/' src/chart.py && python3 src/chart.py && python3 - << 'EOF' from PIL import Image a='/tmp/workspace/jic2027-poster/assets/' im=Image.open(a+'s5_Image_0.jpg').rotate(180); im.save(a+'p_eyes.jpg',quality=92) Image.open(a+'s5_Image_1.jpg').save(a+'p_nose.jpg',quality=92) Image.open(a+'s6_Image_0.jpg').save(a+'p_knee.jpg',quality=92) EOF cat > src/poster.py << 'EOF' from reportlab.pdfgen import canvas from reportlab.lib.units import cm from reportlab.lib.colors import HexColor, white from reportlab.lib.styles import ParagraphStyle from reportlab.platypus import Paragraph, Table, TableStyle from reportlab.lib.utils import ImageReader A="/tmp/workspace/jic2027-poster/assets/" OUT="/tmp/workspace/jic2027-poster/output/JIC2027_GPA_Poster_100x200cm.pdf" PW,PH=100*cm,200*cm NAVY=HexColor("#12355B"); TEAL=HexColor("#1B7F8C"); RED=HexColor("#B23A48"); GOLD=HexColor("#FFD166") LIGHT=HexColor("#EEF4F8"); INK=HexColor("#1E2A38"); LINE=HexColor("#C9D6E0") M=3*cm; CW=PW-2*M; GAP=3*cm; COL=(CW-GAP)/2; PAD=1.3*cm BAR=2.8*cm; FOOT=8*cm; HEAD=37*cm def S(name,size,lead=None,font="Helvetica",color=INK,**kw): return ParagraphStyle(name,fontName=font,fontSize=size,leading=lead or size*1.28,textColor=color,**kw) body=S("b",30,40) bul=S("bu",30,40,leftIndent=1.2*cm,bulletIndent=0.1*cm,spaceAfter=0.35*cm) small=S("s",24,31) ref=S("r",24,31,leftIndent=1.2*cm,firstLineIndent=-1.2*cm,spaceAfter=0.3*cm) cap=S("c",24,30,alignment=1) cell=S("cell",27,34); cellb=S("cellb",27,34,font="Helvetica-Bold",color=NAVY) PH_=lambda t: f'<font backColor="#FFD166" color="#7A4B00">{t}</font>' class Paras: def __init__(s,items): s.items=items def measure(s,w): return sum(p.wrap(w,10000)[1]+p.style.spaceAfter+p.style.spaceBefore for p in s.items) def draw(s,c,x,y,w): for p in s.items: h=p.wrap(w,10000)[1]; y-=p.style.spaceBefore; p.drawOn(c,x,y-h); y-=h+p.style.spaceAfter def P(t,st=body): return Paragraph(t,st) def B(t): return Paragraph(t,bul,bulletText="\u2022") class Spacer_: def __init__(s,h): s.h=h def measure(s,w): return s.h def draw(s,c,x,y,w): pass class Photos: def __init__(s,items): s.items=items # (file, caption) def dims(s,w): g=0.8*cm; iw=(w-2*g)/3; ih=iw*4/3; return g,iw,ih def measure(s,w): g,iw,ih=s.dims(w); return ih+0.4*cm+3*30+0.3*cm def draw(s,c,x,y,w): g,iw,ih=s.dims(w) for i,(f,t) in enumerate(s.items): xx=x+i*(iw+g); c.drawImage(A+f,xx,y-ih,iw,ih,preserveAspectRatio=True,mask=None) c.setStrokeColor(NAVY); c.setLineWidth(2); c.rect(xx,y-ih,iw,ih,fill=0) pp=Paragraph(t,cap); h=pp.wrap(iw,1000)[1]; pp.drawOn(c,xx,y-ih-0.4*cm-h) class Img: def __init__(s,f,h_cm): s.f=f; s.h=h_cm*cm def measure(s,w): return s.h def draw(s,c,x,y,w): c.drawImage(A+s.f,x,y-s.h,w,s.h) class Tbl: def __init__(s,rows,colw,header=True,hl=None): s.rows=rows; s.colw=colw; s.header=header def build(s,w): cw=[w*f for f in s.colw] data=[[Paragraph(str(c),cellb if (j==0 or (s.header and i==0)) else cell) for j,c in enumerate(r)] for i,r in enumerate(s.rows)] t=Table(data,colWidths=cw) st=[("GRID",(0,0),(-1,-1),1.2,LINE),("VALIGN",(0,0),(-1,-1),"MIDDLE"), ("TOPPADDING",(0,0),(-1,-1),7),("BOTTOMPADDING",(0,0),(-1,-1),9),("LEFTPADDING",(0,0),(-1,-1),10), ("ROWBACKGROUNDS",(0,1 if s.header else 0),(-1,-1),[white,HexColor("#F6F9FB")])] if s.header: st+= [("BACKGROUND",(0,0),(-1,0),HexColor("#DCE8F0"))] t.setStyle(TableStyle(st)); return t def measure(s,w): return s.build(w).wrap(w,10000)[1] def draw(s,c,x,y,w): t=s.build(w); h=t.wrap(w,10000)[1]; t.drawOn(c,x,y-h) class Callout: def __init__(s,big,small_): s.big=big; s.small_=small_ def measure(s,w): return 5.2*cm def draw(s,c,x,y,w): c.setFillColor(NAVY); c.roundRect(x,y-5.2*cm,w,5.2*cm,0.5*cm,fill=1,stroke=0) c.setFillColor(GOLD); c.setFont("Helvetica-Bold",68); c.drawString(x+0.9*cm,y-3.4*cm,s.big) c.setFillColor(white); c.setFont("Helvetica",30) for i,l in enumerate(s.small_): c.drawString(x+19.5*cm,y-2.6*cm-i*1.3*cm+0.6*cm,l) class Panel: def __init__(s,title,items,color=TEAL): s.title=title; s.items=items; s.color=color def inner(s,w): return w-2*PAD def content_h(s,w): return sum(i.measure(s.inner(w)) for i in s.items)+PAD*2+0.5*cm*(len(s.items)-1) def height(s,w): return BAR+s.content_h(w) def draw(s,c,x,ytop,w,h): c.setFillColor(LIGHT); c.setStrokeColor(LINE); c.setLineWidth(2) c.roundRect(x,ytop-h,w,h,0.6*cm,fill=1,stroke=1) c.setFillColor(s.color); p=c.beginPath(); p.roundRect(x,ytop-BAR,w,BAR,0.6*cm); c.drawPath(p,fill=1,stroke=0) c.rect(x,ytop-BAR,w,BAR/2,fill=1,stroke=0) c.setFillColor(white); c.setFont("Helvetica-Bold",48); c.drawString(x+PAD,ytop-BAR+0.85*cm,s.title) y=ytop-BAR-PAD for it in s.items: it.draw(c,x+PAD,y,s.inner(w)); y-=it.measure(s.inner(w))+0.5*cm c=canvas.Canvas(OUT,pagesize=(PW,PH)) c.setTitle("Flare of PR3-ANCA GPA during Cyclophosphamide Induction - JIC 2027 poster") # ---------------- header c.setFillColor(NAVY); c.rect(0,PH-HEAD,PW,HEAD,fill=1,stroke=0) c.setFillColor(TEAL); c.rect(0,PH-HEAD-0.7*cm,PW,0.7*cm,fill=1,stroke=0) c.setFillColor(GOLD); c.setFont("Helvetica-Bold",36); c.drawString(M,PH-3.2*cm,"JIC 2027 | CLINICAL CASE STUDY | RHEUMATOLOGY") tp=Paragraph("Flare of PR3-ANCA Granulomatosis with Polyangiitis during Cyclophosphamide Induction: Rapid Response to Rituximab and Pulse Methylprednisolone",S("t",74,86,font="Helvetica-Bold",color=white)) h=tp.wrap(CW,1000)[1]; tp.drawOn(c,M,PH-5*cm-h) au=Paragraph(PH_("[Presenting author]")+"*, "+PH_("[Co-author 2]")+", "+PH_("[Co-author 3]")+", "+PH_("[Guide / Head of department]"),S("a",40,50,color=white)) h2=au.wrap(CW,1000)[1]; y=PH-5*cm-h-1.4*cm; au.drawOn(c,M,y-h2) af=Paragraph(PH_("[Department of Rheumatology, Institution]")+", Ahmedabad, India. *Correspondence: "+PH_("[email]"),S("af",30,38,color=HexColor("#DCE8F0"))) h3=af.wrap(CW,1000)[1]; af.drawOn(c,M,y-h2-0.7*cm-h3) # ---------------- content intro=Panel("Introduction",[Paras([P("Granulomatosis with polyangiitis (GPA) is a PR3-ANCA associated necrotizing vasculitis of small vessels. It typically involves the upper airway, lungs and kidneys, and can also affect the ears, eyes and joints."), P("Cyclophosphamide or rituximab with glucocorticoids is standard induction. Disease can still flare during induction. We describe a young man with multisystem GPA whose disease flared on cyclophosphamide and settled quickly after rituximab.")])]) aim=Panel("Aim and Objectives",[Paras([P("<b>Aim:</b> To describe a multisystem presentation of PR3-ANCA GPA and its flare during induction therapy."), B("Show ear, eye and joint features that are easily dismissed"),B("Record the flare during cyclophosphamide induction"), B("Track CRP, ESR and Hb through rituximab and pulse methylprednisolone"),B("Discuss when to change the induction agent")])]) caseh=Panel("Case History",[Paras([ B("<b>Patient:</b> 29-year-old male driver, tobacco chewer; no comorbidity; family history not significant"), B("<b>Past:</b> recurrent otitis media and sensorineural hearing loss"), B("<b>20 days:</b> giddiness, generalised weakness, low-grade fever, anorexia"), B("<b>15-16 days:</b> cough with haemoptysis, epistaxis, nasal crusting"), B("<b>100 days:</b> left knee pain and swelling, worse over the last 10-12 days; 2-3 kg weight loss"), B("<b>Absent:</b> rash, sicca symptoms, genital ulcers, small joint and back pain"), B("<b>Examination:</b> bilateral conjunctival injection, dark nasal crust, bilateral knee swelling (left more than right) with left effusion")])]) photos=Panel("Clinical Findings",[Photos([("p_eyes.jpg","<b>A.</b> Bilateral conjunctival injection"),("p_nose.jpg","<b>B.</b> Nasal mucosal crusting"),("p_knee.jpg","<b>C.</b> Bilateral knee swelling, left more than right")]), Tbl([["System","Finding"],["Upper airway","Epistaxis, nasal crust"],["Ear","Recurrent otitis media, SNHL"],["Eye","Conjunctival injection"],["Lung","Cough, haemoptysis, infiltrates"],["Joint","Left knee monoarthritis"],["Kidney","10-12 RBC/hpf, ACR 40.7 mg/g"]],[0.32,0.68])]) inv=Panel("Investigations at Presentation",[Tbl([["Test","Result"],["Haemoglobin","9.9 g/dL"],["WBC / Platelets","17,460 / 795,000 per µL (peak)"],["CRP / ESR","303.9 mg/L / 85 mm/h"],["Ferritin","above 1850 ng/mL"],["Creatinine","0.58 mg/dL (0.95 at first check)"],["Urine","RBC 10-12/hpf; ACR 40.7 mg/g"],["NT-proBNP","372 pg/mL"],["PR3-ANCA (ELISA)","<b>72 IU/mL</b> (reference below 3)"],["ANA, HBsAg, HCV","Negative"],["Dengue, Widal","Negative"],["Blood and urine culture","No growth"],["Sputum CBNAAT","TB not detected"]],[0.42,0.58])]) dx=Panel("Imaging and Diagnosis",[Callout("PR3 72","PR3-ANCA, IU/mL|reference below 3".split("|")), Paras([B("<b>CECT thorax:</b> diffuse nodular infiltrates and dense consolidation with necrotizing areas in right upper, right middle and both lower lobes"), B("<b>CT paranasal sinuses:</b> normal"),B("<b>Ultrasound:</b> left pleural effusion, minimal left knee effusion, left popliteal partial thrombus"), B("<b>Echo:</b> EF 60%, RVSP 22 mmHg"), B("<b>Diagnosis: GPA</b> with upper airway, ear, eye, lung, joint and probable renal involvement"), B("<b>Excluded:</b> SLE (ANA negative), viral hepatitis, tropical fever, tuberculosis, endocarditis (cultures negative)")])],NAVY) course=Panel("Management and Outcome",[Img("course_chart.png",40), Paras([P("<b>Management:</b> Cyclophosphamide 500 mg fortnightly from 21 March 2026. After three doses (last on 30 April) he flared with cough, dyspnoea and crepitations, with CRP 150 mg/L and ground-glass opacities with consolidation on HRCT. Rituximab 1 g was given on 15 May and 1 June 2026 with methylprednisolone 500 mg for three days, then tapering prednisolone."), P("<b>Outcome:</b> Chest radiograph cleared within two days. At five months he is asymptomatic (SpO2 98% on room air) with Hb 10.2 g/dL, ESR 40 mm/h and CRP 4.1 mg/L. Creatinine 1.15 mg/dL and 1+ proteinuria are under surveillance. Maintenance: azathioprine 50 mg twice daily and low-dose prednisolone; rituximab 500 mg planned for 1 December 2026.")])],RED) disc=Panel("Discussion",[Paras([ B("Hearing loss and otitis media should not be dismissed as coincidental in ANCA-positive multisystem disease"), B("Rituximab with glucocorticoids is non-inferior to cyclophosphamide for induction in severe ANCA vasculitis (RAVE, RITUXVAS) and is recommended in current guidelines<super>1-4</super>"), B("Flare eight weeks into cyclophosphamide, with falling Hb and a CRP rebound, justified a prompt change of agent<super>5</super>"), B("Active ANCA vasculitis raises venous thrombosis risk; a popliteal thrombus needs a clear plan"), B("<b>Limitations:</b> no tissue biopsy; single case; short follow-up; creatinine drift to 1.15 mg/dL")])]) concl=Panel("Conclusion and Take-home Points",[Paras([ B("Think GPA in a young patient with nasal crusting, haemoptysis, joint, eye and ear features"), B("A strongly positive PR3-ANCA with typical features supports the diagnosis even before tissue confirmation"), B("Reassess disease activity early; switch to rituximab if the disease flares during induction"), B("Follow CRP, ESR, Hb, creatinine and urine closely after remission"), B("Manage jointly with rheumatology, pulmonology, nephrology, ENT and ophthalmology")])],RED) refs=Panel("References",[Paras([Paragraph(t,ref) for t in [ "1. Stone JH, Merkel PA, Spiera R, et al. Rituximab versus cyclophosphamide for ANCA-associated vasculitis. N Engl J Med 2010;363:221-32.", "2. Jones RB, Tervaert JW, Hauser T, et al. Rituximab versus cyclophosphamide in ANCA-associated renal vasculitis. N Engl J Med 2010;363:211-20.", "3. Hellmich B, Sanchez-Alamo B, Schirmer JH, et al. EULAR recommendations for the management of ANCA-associated vasculitis: 2022 update. Ann Rheum Dis 2024;83:30-47.", "4. Chung SA, Langford CA, Maz M, et al. 2021 ACR/Vasculitis Foundation guideline for the management of ANCA-associated vasculitis. Arthritis Rheumatol 2021;73:1366-83.", "5. Hajishah H, Amini MJ, Chadeganipour AS. Efficacy of rituximab on refractory organ involvements in granulomatosis with polyangiitis: a systematic review of case reports. Curr Rheumatol Rev 2024 (PMID 37907486).", "6. Harrison's Principles of Internal Medicine, 22nd ed. McGraw Hill; 2025."]])],NAVY) ack=Panel("Acknowledgement and Consent",[Paras([P("We thank the patient and his family, and the rheumatology, radiology, laboratory and nursing teams who cared for him."), P(PH_("[Confirm before printing: written informed consent for publication of clinical details and photographs was obtained.]")), P(PH_("[Conflict of interest / funding statement]"))])],NAVY) rows=[(intro,aim),(caseh,photos),(inv,dx),(course,),(disc,concl),(refs,ack)] avail=PH-HEAD-0.7*cm-FOOT def rh(r): return max(p.height(COL if len(r)==2 else CW) for p in r) tot=sum(rh(r) for r in rows); gap=(avail-tot)/(len(rows)+1) print("content",tot/cm,"avail",avail/cm,"gap",gap/cm) y=PH-HEAD-0.7*cm-gap for r in rows: h=rh(r) if len(r)==2: r[0].draw(c,M,y,COL,h); r[1].draw(c,M+COL+GAP,y,COL,h) else: r[0].draw(c,M,y,CW,h) y-=h+gap # ---------------- footer c.setFillColor(NAVY); c.rect(0,0,PW,FOOT,fill=1,stroke=0) c.setFillColor(TEAL); c.rect(0,FOOT,PW,0.7*cm,fill=1,stroke=0) c.setFillColor(white); c.setFont("Helvetica-Bold",58) c.drawCentredString(PW/2,FOOT/2-0.7*cm,"Poster presented at JIC 2027, Ahmedabad, India.") c.showPage(); c.save(); print("saved") EOF python3 src/poster.py && cd output && pdftoppm -r 14 -png JIC2027_GPA_Poster_100x200cm.pdf prev && ls
cd /tmp/workspace/jic2027-poster && sed -i 's/W_CM, H_CM = 91.6, 40.0/W_CM, H_CM = 91.6, 33.0/' src/chart.py && python3 src/chart.py && sed -i 's/body=S("b",30,40)/body=S("b",28,36)/; s/bul=S("bu",30,40,/bul=S("bu",28,36,/; s/Img("course_chart.png",40)/Img("course_chart.png",33)/; s/FOOT=8\*cm; HEAD=37\*cm/FOOT=7*cm; HEAD=34*cm/; s/cell=S("cell",27,34); cellb=S("cellb",27,34,/cell=S("cell",26,31); cellb=S("cellb",26,31,/' src/poster.py && python3 src/poster.py && cd output && rm -f prev*.png && pdftoppm -r 16 -png JIC2027_GPA_Poster_100x200cm.pdf prev && ls
cd /tmp/workspace/jic2027-poster && python3 - << 'EOF' s=open('src/poster.py').read() s=s.replace('FOOT=7*cm; HEAD=34*cm','FOOT=7*cm; HEAD=27*cm') s=s.replace('body=S("b",28,36)','body=S("b",31,41)').replace('bul=S("bu",28,36,','bul=S("bu",31,41,') s=s.replace('cell=S("cell",26,31); cellb=S("cellb",26,31,','cell=S("cell",28,33); cellb=S("cellb",28,33,') s=s.replace('S("t",74,86,','S("t",80,92,') s=s.replace('<super>1-4</super>',' [1-4]').replace('<super>5</super>',' [5]') # move organ table to left panel s=s.replace(''' B("<b>Examination:</b> bilateral conjunctival injection, dark nasal crust, bilateral knee swelling (left more than right) with left effusion")])])''',''' B("<b>Examination:</b> bilateral conjunctival injection, dark nasal crust, bilateral knee swelling (left more than right) with left effusion")]), Tbl([["System","Finding"],["Upper airway","Epistaxis, nasal crust"],["Ear","Recurrent otitis media, SNHL"],["Eye","Conjunctival injection"],["Lung","Cough, haemoptysis, infiltrates"],["Joint","Left knee monoarthritis"],["Kidney","10-12 RBC/hpf, ACR 40.7 mg/g"]],[0.32,0.68])])''') a=s.index(' Tbl([["System","Finding"],["Upper airway"',s.index('photos=Panel')) b=s.index('inv=Panel') s=s[:a].rstrip().rstrip(',')+'])\n'+s[b:] open('src/poster.py','w').write(s) EOF sed -n '/^photos=Panel/,/^inv=Panel/p' src/poster.py | head -5; python3 src/poster.py && cd output && rm -f prev*.png && pdftoppm -r 18 -png JIC2027_GPA_Poster_100x200cm.pdf prev && ls
cd /tmp/workspace/jic2027-poster && sed -i 's/W_CM, H_CM = 91.6, 33.0/W_CM, H_CM = 91.6, 30.0/' src/chart.py && python3 src/chart.py && sed -i 's/body=S("b",31,41)/body=S("b",29,37)/; s/bul=S("bu",31,41,leftIndent=1.2\*cm,bulletIndent=0.1\*cm,spaceAfter=0.35\*cm)/bul=S("bu",29,37,leftIndent=1.2*cm,bulletIndent=0.1*cm,spaceAfter=0.25*cm)/; s/Img("course_chart.png",33)/Img("course_chart.png",30)/; s/PAD=1.3\*cm/PAD=1.1*cm/; s/BAR=2.8\*cm/BAR=2.6*cm/; s/cell=S("cell",28,33); cellb=S("cellb",28,33,/cell=S("cell",27,31); cellb=S("cellb",27,31,/; s/("TOPPADDING",(0,0),(-1,-1),7),("BOTTOMPADDING",(0,0),(-1,-1),9)/("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),7)/' src/poster.py && python3 src/poster.py && cd output && rm -f prev*.png && pdftoppm -r 18 -png JIC2027_GPA_Poster_100x200cm.pdf prev
cd /tmp/workspace/jic2027-poster && python3 - << 'EOF' s=open('src/poster.py').read() s=s.replace('HEAD=27*cm','HEAD=24*cm') s=s.replace('body=S("b",29,37)','body=S("b",32,41)').replace('bul=S("bu",29,37,leftIndent=1.2*cm,bulletIndent=0.1*cm,spaceAfter=0.25*cm)','bul=S("bu",32,41,leftIndent=1.2*cm,bulletIndent=0.1*cm,spaceAfter=0.3*cm)') s=s.replace('cell=S("cell",27,31); cellb=S("cellb",27,31,','cell=S("cell",29,34); cellb=S("cellb",29,34,') s=s.replace('ref=S("r",24,31,','ref=S("r",26,33,') s=s.replace('S("t",80,92,','S("t",84,96,') s=s.replace('PAD=1.1*cm','PAD=1.2*cm') # center option s=s.replace('def __init__(s,title,items,color=TEAL): s.title=title; s.items=items; s.color=color','def __init__(s,title,items,color=TEAL,center=False): s.title=title; s.items=items; s.color=color; s.center=center') s=s.replace(' y=ytop-BAR-PAD\n',' y=ytop-BAR-PAD\n if s.center: y-=max(0,(h-s.height(w))/2)\n') s=s.replace('("p_knee.jpg","<b>C.</b> Bilateral knee swelling, left more than right")])])','("p_knee.jpg","<b>C.</b> Bilateral knee swelling, left more than right")])],TEAL,True)') open('src/poster.py','w').write(s) EOF python3 src/poster.py && cd output && rm -f prev*.png && pdftoppm -r 18 -png JIC2027_GPA_Poster_100x200cm.pdf prev
cd /tmp/workspace/jic2027-poster/output && pdftoppm -r 40 -png JIC2027_GPA_Poster_100x200cm.pdf big && python3 - << 'EOF' from PIL import Image from pypdf import PdfReader r=PdfReader('JIC2027_GPA_Poster_100x200cm.pdf'); b=r.pages[0].mediabox print('page cm', float(b.width)/72*2.54, float(b.height)/72*2.54) im=Image.open('big-1.png'); print(im.size) w,h=im.size im.crop((0,int(h*0.0),w,int(h*0.36))).save('crop_top.png') im.crop((0,int(h*0.56),w,int(h*0.80))).save('crop_mid.png') Image.open('prev-1.png').save('JIC2027_GPA_Poster_preview.png') EOF
cd /tmp/workspace/jic2027-poster && sed -i 's/ax2.set_ylim(-60,350)/ax2.set_ylim(-95,350)/; s/ax2.set_yticks(\[0,100,200,300\])/ax2.set_yticks([0,100,200,300])/' src/chart.py && python3 src/chart.py && sed -i 's/bul=S("bu",32,41,leftIndent=1.2\*cm,bulletIndent=0.1\*cm,spaceAfter=0.3\*cm)/bul=S("bu",32,41,leftIndent=1.2*cm,bulletIndent=0.1*cm,spaceAfter=0.3*cm,bulletFontName="Helvetica-Bold",bulletFontSize=34,bulletColor=TEAL)/' src/poster.py && python3 src/poster.py && cd output && rm -f prev*.png big*.png crop*.png && pdftoppm -r 40 -png JIC2027_GPA_Poster_100x200cm.pdf big && python3 - << 'EOF' from PIL import Image im=Image.open('big-1.png'); w,h=im.size im.crop((0,int(h*0.12),w,int(h*0.30))).save('crop_a.png') im.resize((w//3,h//3)).save('JIC2027_GPA_Poster_preview.png') EOF ls
JIC2027 GPA Poster 100x200cm
PDF Document · PDF
JIC2027 GPA Poster preview
Image · PNG