This commit is contained in:
2026-09-11 11:51:26 +08:00
parent d60689ce02
commit d2cff49b9e
45 changed files with 569 additions and 66 deletions
@@ -61,7 +61,8 @@ public class DispatchBolRenderer {
line(s,u,105,top,105,bottom); line(s,u,left,50,right,50);
blackHeader(s,u,f,"SHIP FROM",left,top,105,27); blackHeader(s,u,f,"CARRIER",105,top,right,27);
blackHeader(s,u,f,"SHIP TO",left,50,105,56); blackHeader(s,u,f,"REFERENCE",105,50,right,56);
text(s,u,f,d.shipFromName(),9.5f,left+2,33); text(s,u,f,"Address: " + d.shipFromAddress(),7.5f,left+2,40);
text(s,u,f,d.shipFromName(),9.5f,left+2,33);
wrappedText(s,u,f,"Address: " + d.shipFromAddress(),7.2f,left+2,40,91,2,4.5);
text(s,u,f,"Carrier Name: " + d.carrierName(),7.5f,107,32); text(s,u,f,"ISA #: " + d.isaNumber(),7.5f,107,36.5);
text(s,u,f,"Appointment time: " + d.appointmentTime(),7.5f,107,41); text(s,u,f,"Trailer #: " + d.trailerNumber(),7.5f,107,45.5);
text(s,u,f,"Seal #: " + d.sealNumber(),7.5f,107,49);
@@ -132,6 +133,21 @@ public class DispatchBolRenderer {
private void fill(PDPageContentStream s,PdfUnits u,Color color,double x1,double y1,double x2,double y2)throws IOException{s.setNonStrokingColor(color);s.addRect(PdfUnits.mmToPt(x1),u.topDownMmToPdfY(y2),PdfUnits.mmToPt(x2-x1),PdfUnits.mmToPt(y2-y1));s.fill();}
private void signature(PDPageContentStream s,PdfUnits u,PDFont f,double x,double y,String label)throws IOException{line(s,u,x,y,x+52,y);centeredCell(s,u,f,label,6.2f,x,x+52,y+8);}
private void centered(PDPageContentStream s,PdfUnits u,PDFont f,String value,float size,double centerX,double y)throws IOException{float w=f.getStringWidth(value)/1000*size;text(s,u,f,value,size,centerX-w/PdfUnits.mmToPt(1)/2,y);}
private void wrappedText(PDPageContentStream s,PdfUnits u,PDFont f,String value,float size,double x,double y,double width,int maxLines,double lineHeight)throws IOException{
String remaining=value==null?"—":value.strip();
for(int lineIndex=0;lineIndex<maxLines&&!remaining.isEmpty();lineIndex++){
String line=fitLine(f,remaining,size,PdfUnits.mmToPt(width));
boolean truncated=line.length()<remaining.length();
if(lineIndex==maxLines-1&&truncated)line=fit(f,remaining,size,PdfUnits.mmToPt(width));
text(s,u,f,line,size,x,y+lineIndex*lineHeight);
remaining=truncated?remaining.substring(line.length()).strip():"";
}
}
private String fitLine(PDFont f,String value,float size,float max)throws IOException{
if(f.getStringWidth(value)/1000*size<=max)return value;
int end=value.length();while(end>0&&f.getStringWidth(value.substring(0,end))/1000*size>max)end--;
int space=value.lastIndexOf(' ',end);return value.substring(0,space>0?space:end).stripTrailing();
}
private void centeredLines(PDPageContentStream s,PdfUnits u,PDFont f,String[] values,float size,double x1,double x2,double y)throws IOException{for(int i=0;i<values.length;i++)centeredCell(s,u,f,values[i],size,x1+.3,x2-.3,y+i*3.5);}
private void centeredCell(PDPageContentStream s,PdfUnits u,PDFont f,String value,float size,double x1,double x2,double y)throws IOException{String fit=fit(f,value,size,PdfUnits.mmToPt(x2-x1));float w=f.getStringWidth(fit)/1000*size;text(s,u,f,fit,size,x1+(x2-x1-w/PdfUnits.mmToPt(1))/2,y);}
private void right(PDPageContentStream s,PdfUnits u,PDFont f,String value,float size,double x,double y)throws IOException{float w=f.getStringWidth(value)/1000*size;text(s,u,f,value,size,x-w/PdfUnits.mmToPt(1),y);}