@ -47,14 +47,13 @@ import static org.apache.poi.xwpf.usermodel.Document.*;
public class WordBuilder {
private static final Logger logger = LoggerFactory . getLogger ( WordBuilder . class ) ;
private static final Map < String , Integer > IMAGE_TYPE_MAP = Stream . of ( new Object [ ] [ ] {
{ ".jpeg" , PICTURE_TYPE_JPEG } ,
{ ".jpg" , PICTURE_TYPE_JPEG } ,
{ ".png" , PICTURE_TYPE_PNG } ,
{ ".gif" , PICTURE_TYPE_GIF } ,
{ ".tiff" , PICTURE_TYPE_TIFF } ,
{ ".bmp" , PICTURE_TYPE_BMP } ,
{ ".wmf" , PICTURE_TYPE_WMF }
}
{ "image/jpeg" , PICTURE_TYPE_JPEG } ,
{ "image/png" , PICTURE_TYPE_PNG } ,
{ "image/gif" , PICTURE_TYPE_GIF } ,
{ "image/tiff" , PICTURE_TYPE_TIFF } ,
{ "image/bmp" , PICTURE_TYPE_BMP } ,
{ "image/wmf" , PICTURE_TYPE_WMF }
}
) . collect ( Collectors . toMap ( objects - > ( String ) objects [ 0 ] , o - > ( Integer ) o [ 1 ] ) ) ;
private Map < ParagraphStyle , ApplierWithValue < XWPFDocument , Object , XWPFParagraph > > options = new HashMap < > ( ) ;
@ -158,12 +157,13 @@ public class WordBuilder {
} ) ;
this . options . put ( ParagraphStyle . IMAGE , ( mainDocumentPart , item ) - > {
XWPFParagraph paragraph = mainDocumentPart . createParagraph ( ) ;
paragraph . setPageBreak ( true ) ;
XWPFRun run = paragraph . createRun ( ) ;
String imageId = ( ( Map < String , String > ) item ) . get ( "id" ) ;
String fileName = ( ( Map < String , String > ) item ) . get ( "name" ) ;
String fileType = ( ( Map < String , String > ) item ) . get ( "type" ) ;
int format ;
String fileExtension = fileName . substring ( fileName . lastIndexOf ( "." ) ) ;
format = IMAGE_TYPE_MAP . getOrDefault ( fileExtension , 0 ) ;
format = IMAGE_TYPE_MAP . getOrDefault ( fileType , 0 ) ;
try {
FileInputStream image = new FileInputStream ( environment . getProperty ( "file.storage" ) + imageId ) ;
ImageInputStream iis = ImageIO . createImageInputStream ( new File ( environment . getProperty ( "file.storage" ) + imageId ) ) ;
@ -171,13 +171,36 @@ public class WordBuilder {
if ( readers . hasNext ( ) ) {
ImageReader reader = readers . next ( ) ;
reader . setInput ( iis ) ;
int pageWidth = Math . round ( mainDocumentPart . getDocument ( ) . getBody ( ) . getSectPr ( ) . getPgSz ( ) . getW ( ) . intValue ( ) / ( float ) 20 ) ; // dxa to points
int imageWidth = Math . round ( reader . getWidth ( 0 ) * ( float ) 0.75 ) ; // pixels to points
int initialImageWidth = reader . getWidth ( 0 ) ;
int initialImageHeight = reader . getHeight ( 0 ) ;
float ratio = initialImageHeight / ( float ) initialImageWidth ;
int marginLeftInDXA = mainDocumentPart . getDocument ( ) . getBody ( ) . getSectPr ( ) . getPgMar ( ) . getLeft ( ) . intValue ( ) ;
int marginRightInDXA = mainDocumentPart . getDocument ( ) . getBody ( ) . getSectPr ( ) . getPgMar ( ) . getRight ( ) . intValue ( ) ;
int pageWidthInDXA = mainDocumentPart . getDocument ( ) . getBody ( ) . getSectPr ( ) . getPgSz ( ) . getW ( ) . intValue ( ) ;
int pageWidth = Math . round ( ( pageWidthInDXA - marginLeftInDXA - marginRightInDXA ) / ( float ) 20 ) ; // /20 converts dxa to points
int imageWidth = Math . round ( initialImageWidth * ( float ) 0.75 ) ; // *0.75 converts pixels to points
int width = Math . min ( imageWidth , pageWidth ) ;
int pageHeight = Math . round ( mainDocumentPart . getDocument ( ) . getBody ( ) . getSectPr ( ) . getPgSz ( ) . getH ( ) . intValue ( ) / ( float ) 20 ) ;
int imageHeight = Math . round ( reader . getHeight ( 0 ) * ( float ) 0.75 ) ;
int height = Math . min ( imageHeight , pageHeight ) ;
int marginTopInDXA = mainDocumentPart . getDocument ( ) . getBody ( ) . getSectPr ( ) . getPgMar ( ) . getTop ( ) . intValue ( ) ;
int marginBottomInDXA = mainDocumentPart . getDocument ( ) . getBody ( ) . getSectPr ( ) . getPgMar ( ) . getBottom ( ) . intValue ( ) ;
int pageHeightInDXA = mainDocumentPart . getDocument ( ) . getBody ( ) . getSectPr ( ) . getPgSz ( ) . getH ( ) . intValue ( ) ;
int pageHeight = Math . round ( ( pageHeightInDXA - marginTopInDXA - marginBottomInDXA ) / ( float ) 20 ) ; // /20 converts dxa to points
int imageHeight = Math . round ( initialImageHeight * ( ( float ) 0.75 ) ) ; // *0.75 converts pixels to points
int height = Math . round ( width * ratio ) ;
if ( height > pageHeight ) {
// height calculated with ratio is too large. Image may have Portrait (vertical) orientation. Recalculate image dimensions.
height = Math . min ( imageHeight , pageHeight ) ;
width = Math . round ( height / ratio ) ;
}
run . addPicture ( image , format , fileName , Units . toEMU ( width ) , Units . toEMU ( height ) ) ;
paragraph . setPageBreak ( false ) ;
}
} catch ( IOException | InvalidFormatException e ) {
logger . error ( e . getMessage ( ) , e ) ;