рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдореЗрдВ рдЖрдкрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг

рдпрджрд┐ рдЖрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ jstl, рдлреНрд░реАрдорд╛рд░реНрдХрд░, рд╡реЗрд▓реЛрд╕рд┐рдЯреА рдФрд░ рдЬрд╕рдкрд░рдкреЛрд░реНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреАрдбреАрдПрдл, рдПрдХреНрд╕реЗрд▓, рд╕реАрдПрд╕рд╡реА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбреЙрдХреНрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рднрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдПрдХ рддрд░рдл, рдЖрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдорд╛рдирдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдХрдИ рдмрд╛рд░ рдЗрд╕ рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд░рдЦреЗрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдорд╡реАрд╕реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рджреГрд╢реНрдп рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ AbstractTemplateView рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░ рджреГрд╢реНрдп (рджреГрд╢реНрдп) рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдбреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреГрд╢реНрдп рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдкреИрдХреЗрдЬ ru.habrahabr.spring.view ;

рдЖрдпрд╛рдд org.apache.commons.codec.binary.Base64 ;
рдЖрдпрд╛рдд org.docx4j.XmlUtils ;
рдЖрдпрд╛рдд org.docx4j.openpackaging.io.SaveToZipFile ;
рдЖрдпрд╛рдд org.docx4j.openpackaging.packages.WordprocessingMLPackage ;
рдЖрдпрд╛рдд org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart ;
рдЖрдпрд╛рдд org.docx4j.wml.Document ;
рдЖрдпрд╛рдд org.springframework.web.servlet.view.AbstractTemplateView ;

рдЖрдпрд╛рдд javax.servlet.ServletOutputStream ;
рдЖрдпрд╛рдд javax.servlet.http.HttpServletRequest ;
рдЖрдпрд╛рдд javax.servlet.http.HttpServletResponse ;
рдЖрдпрд╛рдд java.net.URLEncoder ;
рдЖрдпрд╛рдд java.util.HashMap ;
рдЖрдпрд╛рдд java.util.Locale ;
рдЖрдпрд╛рдд java.util.Map ;

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ DocxView рдиреЗ AbstractTemplateView {

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ DocxView ( ) {
setContentType ( "рдПрдкреНрд▓рд┐рдХреЗрд╢рди / vnd.openxmlformats-officedocument.wordprocessingml.document" ) ;
}

@ рдУрд╡рд░рд░рд╛рдЗрдб
рд╕рдВрд░рдХреНрд╖рд┐рдд рдмреВрд▓рд┐рдпрди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдбрд╛рдЙрдирд▓реЛрдб ( ) {
рд╕рдЪ рд▓реМрдЯрдирд╛ ;
}

@ рдУрд╡рд░рд░рд╛рдЗрдб
рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢реВрдиреНрдп рд░реЗрдВрдбрд░рдореЗрдпрд░рдбреЗрдордЯреЗрдореНрдкрд▓реЗрдЯрдореЙрдбрд▓ ( рдорд╛рдирдЪрд┐рддреНрд░ < рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдСрдмреНрдЬреЗрдХреНрдЯ > рдореЙрдбрд▓,
HttpServletRequest рдЕрдиреБрд░реЛрдз, HttpServletResponse рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ ) рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ {

WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackageред load ( getApplicationContext ( ) ред getResource ( getUrl ( ) ) ред getFile ( ) ) ;

MainDocumentPart documentPart = wordMLPackageред getMainDocumentPart ( ) ;
orgред docx4j ред wml рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ wmlDocumentEl = ( orgред Docx4j ред Wml ред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ ) рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рдкрд╛рд░реНрдЯред getJaxbElement ( ) ;
рд╕реНрдЯреНрд░рд┐рдВрдЧ xml = XmlUtilsред marshaltoString ( wmlDocumentEl, true ) ;

HashMap < рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕реНрдЯреНрд░рд┐рдВрдЧ > рдореИрдкрд┐рдВрдЧ = рдирдпрд╛ HashMap < рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕реНрдЯреНрд░рд┐рдВрдЧ > ( ) ;
for ( рдСрдмреНрдЬреЗрдХреНрдЯ рдХреБрдВрдЬреА: рдореЙрдбрд▓ред keySet ( ) ) {
рдореИрдкрд┐рдВрдЧред put ( рдХреАред toString ( ) , рдореЙрдбрд▓ред get ( рдХреА )) toString ( ) ;
}

рдСрдмреНрдЬреЗрдХреНрдЯ obj = XmlUtilsред unmarshallFromTemplate ( xml, mappings ) ;
documentPartред setJaxbElement ( ( рдбреЙрдХреНрдпреВрдореЗрдВрдЯ ) obj ) ;

рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╛рдо = рдореЙрдбрд▓ред get ( "рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" ) + ".docx" ;

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред setHeader ( "рд╕рд╛рдордЧреНрд░реА- рд╡рд┐рд╡рд╛рдж " , "рдЕрдиреБрд▓рдЧреНрдирдХ" + рдирд╛рдо ) ;

ServletOutputStream рдмрд╛рд╣рд░ = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред getOutputStream ( ) ;
( new SaveToZipFile ( wordMLPackage ) ) ред рдмрдЪрд╛ ( рдмрд╛рд╣рд░ ) ;

рдмрд╛рд╣рд░ред рдлреНрд▓рд╢ ( ) ;

}

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреВрд▓рд┐рдпрди checkResource ( рд▓реЛрдХреЗрд▓ рд▓реЛрдХреЗрд▓ ) {
рд╡рд╛рдкрд╕реА getApplicationContext ( ) ред getResource ( getUrl ( ) ) ред рдореМрдЬреВрдж ( ) ;
}

}

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╣рдо рдХрдВрдЯреЗрдВрдЯ рдЯрд╛рдЗрдк рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬреЗрдирд░реЗрдЯреНрд╕рдбрд╛рдЙрдирд▓реЛрдб рдХреЙрдиреНрдЯреЗрдВрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдЯреЗрдВрдЯ рдЯрд╛рдЗрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдФрд░ renderMergedTemplateModel рдореЗрдВ рд╣рдо рдлрд╛рдЗрд▓ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, getUrl рд╕реЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднрд░рддреЗ рд╣реИрдВред рдЯреЗрдореНрдкрд▓реЗрдЯ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛ рдореЙрдбрд▓ рд╕реЗ рдЖрддрд╛ рд╣реИред checkResouce рдХреЛ рд╡реНрдпреВ рдлрд╛рдЗрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЕрдм рдЬрдм рджреГрд╢реНрдп рддреИрдпрд╛рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ mvc-config.xml рдРрдб рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡реНрдпреВ рд▓реЛрдХреЗрдЯрд░реНрд╕ (рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╡реНрдпреВрд╡рд░реНрд╕) рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
< bean id = "docxViewResolver" рд╡рд░реНрдЧ = " org.springframework.web.servlet.view.UrlBasedViewResolver " >
< рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо = "viewClass" рдорд╛рди = "en.habrabr.spring.view.DocxView" > </ property >
< рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо = "рдЖрджреЗрд╢" рдореВрд▓реНрдп = "1" />
< рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо = "рдЙрдкрд╕рд░реНрдЧ" рдорд╛рди = "/ рд╡реЗрдм-рдЗрди / рд╡рд┐рдЪрд╛рд░ /" />
< рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо = "рдкреНрд░рддреНрдпрдп" рдореВрд▓реНрдп = ".docx" />
</ рд╕реЗрдо >

< bean id = "jspViewResolver" class = " org.springframework.web.servlet.view.InternalResourceViewResolver " >
< рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо = "рдЙрдкрд╕рд░реНрдЧ" рдорд╛рди = "/ рд╡реЗрдм-рдЗрди / рд╡рд┐рдЪрд╛рд░ /" />
< рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо = "рдкреНрд░рддреНрдпрдп" рдореВрд▓реНрдп = ".jsp" />
</ рд╕реЗрдо >


рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд╛рдпрдХ UrlBasedViewResolver рдХреА рд╕реНрдерд╛рдкрдирд╛ рдкрд░ред рдпрд╣ рд▓реЛрдХреЗрдЯрд░ рдЖрдкрдХреЛ рдореВрд▓ рджреГрд╢реНрдп рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ , рдЬрд┐рд╕реЗ viewClass рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдкрд╕рд░реНрдЧ , рдкреНрд░рддреНрдпрдп рдХреЛ рдПрдХ рдорд╛рдирдХ рджреГрд╢реНрдп рд▓реЛрдХреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдирддреАрдЬрддрди, рд▓реЛрдХреЗрдЯрд░ UrlBasedViewResolver рдХреЛ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ , рдЬреЛ рд╡реНрдпреВ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП checkResource () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ рдЭреВрдареА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА, рдФрд░ рд▓реЛрдХреЗрдЯрд░ рджреГрд╢реНрдп рдХреЗ рдмрдЬрд╛рдп рдЕрд╢рдХреНрдд рд▓реМрдЯ рдЖрдПрдЧрд╛ рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЖрдВрддрд░рд┐рдХResourceViewResolver рдкрд░ рдХреВрдж рдЬрд╛рдПрдЧреАред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк test.docx рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреГрд╢реНрдп / docx рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВред рдФрд░ рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣рдо рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ:
рдкреИрдХреЗрдЬ ru.habrahabr.spring.controller ;

рдЖрдпрд╛рдд org.springframework.stereotype.Controller ;
рдЖрдпрд╛рдд org.springframework.ui.Model ;
рдЖрдпрд╛рдд org.springframework.util.MultiValueMap ;
рдЖрдпрд╛рдд org.springframework.web.bind.annotation.RequestMapping ;

рдирд┐рдпрдВрддреНрд░рдХ
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ DocxController {

@RequestMapping ( рдорд╛рди = "/ get / docx" , рд╡рд┐рдзрд┐ = RequestMethodред GET )
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ doGenerate ( рдореЙрдбрд▓ рдореЙрдбрд▓ ) {
рдореЙрдбрд▓ред addAttribute ( "рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" , "рдкрд░реАрдХреНрд╖рдг" ) ;
рдореЙрдбрд▓ред AddAttribute ( "рдкрд░реАрдХреНрд╖рдг" , "рдкрд░реАрдХреНрд╖рдг" ) ;
рд╡рд╛рдкрд╕реА "docx / рдкрд░реАрдХреНрд╖рдг" ;

рдЖрдЧреЗ, рд╣рдо get / docx рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ docx рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In101546/


All Articles