1、简介
2、示例
2.1 引入依赖
< dependency>
< groupId> com.github.librepdf</ groupId>
< artifactId> openpdf</ artifactId>
< version> 1.3.34</ version>
</ dependency>
< dependency>
< groupId> com.github.librepdf</ groupId>
< artifactId> openpdf-fonts-extra</ artifactId>
< version> 1.3.34</ version>
</ dependency>
2.2 代码
2.2.1 主程序
String filePath = "/Users/xingyu/Documents/tmp/a.pdf" ;
FileOutputStream fos = new FileOutputStream ( filePath) ;
PdfWriter pdfWriter = null ;
Document document = null ;
try {
document = new Document ( ) ;
document. setPageSize ( PageSize . A4) ;
pdfWriter = PdfWriter . getInstance ( document, fos) ;
document. open ( ) ;
Image rightTopIcon = getRightTopIcon ( "4" ) ;
document. add ( rightTopIcon) ;
Paragraph titleParagraph = createParagraph ( "新模版002" , FONT_TITLE, Element . ALIGN_CENTER, 0 ) ;
document. add ( titleParagraph) ;
ProcessPdfVO processPdf = new ProcessPdfVO ( ) ;
processPdf. setCompanyName ( "xxx公司" ) ;
processPdf. setCreateTime ( "2024-05-27" ) ;
processPdf. setProcessId ( "202405270004" ) ;
processPdf. setPrintDateTime ( "2024-05-28 17:25:09" ) ;
processPdf. setPrinter ( "张三" ) ;
PdfPTable firstRow = createFirstRow ( processPdf) ;
document. add ( firstRow) ;
PdfPTable mainTable = createMainTable ( ) ;
PdfPCell cell = new PdfPCell ( createParagraph ( "审批流程" , FONT_MAIN_TABLE, Element . ALIGN_CENTER, 0 ) ) ;
cell. setHorizontalAlignment ( PdfPCell . ALIGN_CENTER) ;
cell. setVerticalAlignment ( PdfPCell . ALIGN_MIDDLE) ;
mainTable. addCell ( cell) ;
PdfPTable subTable = new PdfPTable ( 2 ) ;
subTable. setWidths ( new float [ ] { 30 , 70 } ) ;
subTable. setWidthPercentage ( 100 ) ;
PdfPCell subCell1 = new PdfPCell ( createParagraph ( "subCell1" , FONT_MAIN_TABLE, Element . ALIGN_CENTER, 0 ) ) ;
subCell1. setHorizontalAlignment ( PdfPCell . ALIGN_CENTER) ;
subCell1. setVerticalAlignment ( PdfPCell . ALIGN_MIDDLE) ;
subCell1. setBorder ( Cell . BOX) ;
subTable. addCell ( subCell1) ;
PdfPCell subCell2 = new PdfPCell ( createParagraph ( "subCell2" , FONT_MAIN_TABLE, Element . ALIGN_CENTER, 0 ) ) ;
subCell2. setHorizontalAlignment ( PdfPCell . ALIGN_CENTER) ;
subCell2. setBorder ( Cell . BOX) ;
subTable. addCell ( subCell2) ;
PdfPCell subCell3 = new PdfPCell ( createParagraph ( "subCell3" , FONT_MAIN_TABLE, Element . ALIGN_CENTER, 0 ) ) ;
subCell3. setBorder ( Cell . BOX) ;
subCell3. setHorizontalAlignment ( PdfPCell . ALIGN_CENTER) ;
subTable. addCell ( subCell3) ;
PdfPCell subCell4 = new PdfPCell ( createParagraph ( "subCell4" , FONT_MAIN_TABLE, Element . ALIGN_CENTER, 0 ) ) ;
subCell4. setBorder ( Cell . BOX) ;
subCell4. setHorizontalAlignment ( PdfPCell . ALIGN_CENTER) ;
subTable. addCell ( subCell4) ;
subTable. setComplete ( true ) ;
PdfPCell subCell5 = new PdfPCell ( ) ;
subCell5. setBorder ( Cell . BOX) ;
subCell5. setHorizontalAlignment ( PdfPCell . ALIGN_CENTER) ;
subCell5. setPadding ( 0 ) ;
subCell5. addElement ( subTable) ;
mainTable. addCell ( subCell5) ;
mainTable. addCell ( new PdfPCell ( createParagraph ( "审批流程1" , FONT_MAIN_TABLE, Element . ALIGN_CENTER, 0 ) ) ) ;
mainTable. addCell ( new PdfPCell ( createParagraph ( "审批流程2" , FONT_MAIN_TABLE, Element . ALIGN_CENTER, 0 ) ) ) ;
mainTable. addCell ( new PdfPCell ( createParagraph ( "审批流程3" , FONT_MAIN_TABLE, Element . ALIGN_CENTER, 0 ) ) ) ;
mainTable. addCell ( subCell5) ;
mainTable. setComplete ( true ) ;
document. add ( mainTable) ;
PdfPTable lastTable = createLastTable ( processPdf) ;
document. add ( lastTable) ;
} finally {
IoUtil . close ( document) ;
IoUtil . close ( pdfWriter) ;
IoUtil . close ( fos) ;
}
2.2.2 表格
private static PdfPTable createMainTable ( ) {
PdfPTable table = new PdfPTable ( 2 ) ;
float [ ] width = getUnitValues ( table. getNumberOfColumns ( ) , new float [ ] { 30f , 70f } ) ;
table. setWidths ( width) ;
return table;
}
private static float [ ] getUnitValues ( int columnNum, float [ ] percents) {
float [ ] unitValues = new float [ columnNum] ;
for ( int i = 0 ; i < columnNum; i++ ) {
float percentValue;
if ( Objects . nonNull ( percents) && columnNum == percents. length) {
percentValue = percents[ i] ;
} else {
percentValue = BigDecimal . valueOf ( 100 )
. divide ( BigDecimal . valueOf ( columnNum) , 10 , RoundingMode . HALF_UP)
. floatValue ( ) ;
}
unitValues[ i] = percentValue;
}
return unitValues;
}
2.2.3 单元格
private static PdfPCell createCell ( Integer horizontalAlignment, Integer verticalAlignment, Integer border,
Color borderColor) {
PdfPCell cell = new PdfPCell ( ) ;
if ( Objects . nonNull ( horizontalAlignment) ) {
cell. setHorizontalAlignment ( PdfPCell . ALIGN_CENTER) ;
}
if ( Objects . nonNull ( verticalAlignment) ) {
cell. setVerticalAlignment ( PdfPCell . ALIGN_MIDDLE) ;
}
if ( Objects . nonNull ( border) ) {
cell. setBorder ( border) ;
}
if ( Objects . nonNull ( borderColor) ) {
cell. setBorderColor ( borderColor) ;
}
return cell;
}
2.2.4 创建单元格
private static PdfPCell createCell ( Integer horizontalAlignment, Integer verticalAlignment, Integer border,
Color borderColor) {
PdfPCell cell = new PdfPCell ( ) ;
if ( Objects . nonNull ( horizontalAlignment) ) {
cell. setHorizontalAlignment ( PdfPCell . ALIGN_CENTER) ;
}
if ( Objects . nonNull ( verticalAlignment) ) {
cell. setVerticalAlignment ( PdfPCell . ALIGN_MIDDLE) ;
}
if ( Objects . nonNull ( border) ) {
cell. setBorder ( border) ;
}
if ( Objects . nonNull ( borderColor) ) {
cell. setBorderColor ( borderColor) ;
}
return cell;
}
2.2.5 图片
private static Image getRightTopIcon ( String processStatus) {
Image image = null ;
ProcessStatusEnum processStatusEnum = ProcessStatusEnum . getEnum ( processStatus) ;
if ( Objects . isNull ( processStatusEnum) ) {
return image;
}
if ( StringUtils . isBlank ( processStatusEnum. getIcon ( ) ) ) {
return image;
}
String iconPath = String . format ( Locale . ROOT, "%s%s%s" , "images" , File . separator, processStatusEnum. getIcon ( ) ) ;
InputStream is = null ;
ByteArrayOutputStream bos = null ;
try {
ClassPathResource classPathResource = new ClassPathResource ( iconPath) ;
is = classPathResource. getInputStream ( ) ;
bos = new ByteArrayOutputStream ( ) ;
IoUtil . copy ( is, bos) ;
is. close ( ) ;
image = Image . getInstance ( bos. toByteArray ( ) ) ;
image. scalePercent ( 50 ) ;
image. setAbsolutePosition ( 500 , 700 ) ;
} catch ( Exception e) {
throw new RuntimeException ( e) ;
} finally {
IoUtil . close ( is) ;
IoUtil . close ( bos) ;
}
return image;
}
2.2.6 预览图