xiongzhu 4 år sedan
förälder
incheckning
a6a121dc85

+ 1 - 7
install-jar.sh

@@ -1,11 +1,5 @@
 
-mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file \
--DgroupId=org.libjpegturbo \
--DartifactId=mozjpeg4j \
--Dpackaging=jar \
--Dversion=1.1 \
--Dfile=lib/mozjpeg4j-1.1.jar \
--DlocalRepositoryPath=libs
+mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -DgroupId=jacob -DartifactId=jacob -Dpackaging=jar -Dversion=1.2 -Dfile=lib/jacob.jar -DlocalRepositoryPath=libs
 
 mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file \
 -DgroupId=org.pngquant \

BIN
lib/jacob.jar


+ 6 - 0
pom.xml

@@ -281,6 +281,12 @@
             <artifactId>pngquant4j</artifactId>
             <version>1.0</version>
         </dependency>
+
+        <dependency>
+            <groupId>jacob</groupId>
+            <artifactId>jacob</artifactId>
+            <version>1.2</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 43 - 42
src/main/java/com/izouma/awesomeAdmin/security/WebSecurityConfig.java

@@ -38,7 +38,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     @Autowired
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
         auth.userDetailsService(jwtUserDetailsService)
-                .passwordEncoder(passwordEncoderBean());
+            .passwordEncoder(passwordEncoderBean());
     }
 
     @Bean
@@ -56,34 +56,35 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     protected void configure(HttpSecurity httpSecurity) throws Exception {
         // We don't need CSRF for this example
         httpSecurity.csrf().disable()
-                .cors().and()
-                // dont authenticate this particular request
-                .authorizeRequests()
-                //swagger-ui放行路径
-                .antMatchers("/v2/api-docs", "/swagger-ui.html", "/swagger-resources/**", "/webjars/**").permitAll()
-                .antMatchers("/user/register").permitAll()
-                .antMatchers("/upload/**").permitAll()
-                .antMatchers("/files/**").permitAll()
-                .antMatchers("/static/**").permitAll()
-                .antMatchers("/auth/**").permitAll()
-                .antMatchers("/captcha/**").permitAll()
-                .antMatchers("/admin/**").permitAll()
-                .antMatchers("/systemVariable/all").permitAll()
-                .antMatchers("/**/excel").permitAll()
-                .antMatchers("/wx/**").permitAll()
-                .antMatchers("/sms/sendVerify").permitAll()
-                .antMatchers("/error").permitAll()
-                .antMatchers("/401").permitAll()
-                .antMatchers("/404").permitAll()
-                .antMatchers("/500").permitAll()
-                .antMatchers("/MP_verify*").permitAll()
-                // all other requests need to be authenticated
-                .anyRequest().authenticated().and()
-                // make sure we use stateless session; session won't be used to
-                // store user's state.
-                .exceptionHandling().authenticationEntryPoint(unauthorizedHandler)
-                .and().sessionManagement()
-                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
+                    .cors().and()
+                    // dont authenticate this particular request
+                    .authorizeRequests()
+                    //swagger-ui放行路径
+                    .antMatchers("/v2/api-docs", "/swagger-ui.html", "/swagger-resources/**", "/webjars/**").permitAll()
+                    .antMatchers("/user/register").permitAll()
+                    .antMatchers("/upload/**").permitAll()
+                    .antMatchers("/files/**").permitAll()
+                    .antMatchers("/static/**").permitAll()
+                    .antMatchers("/auth/**").permitAll()
+                    .antMatchers("/captcha/**").permitAll()
+                    .antMatchers("/admin/**").permitAll()
+                    .antMatchers("/systemVariable/all").permitAll()
+                    .antMatchers("/**/excel").permitAll()
+                    .antMatchers("/wx/**").permitAll()
+                    .antMatchers("/sms/sendVerify").permitAll()
+                    .antMatchers("/error").permitAll()
+                    .antMatchers("/401").permitAll()
+                    .antMatchers("/404").permitAll()
+                    .antMatchers("/500").permitAll()
+                    .antMatchers("/MP_verify*").permitAll()
+                    .antMatchers("/word2pdf").permitAll()
+                    // all other requests need to be authenticated
+                    .anyRequest().authenticated().and()
+                    // make sure we use stateless session; session won't be used to
+                    // store user's state.
+                    .exceptionHandling().authenticationEntryPoint(unauthorizedHandler)
+                    .and().sessionManagement()
+                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
         // Add a filter to validate the tokens with every request
         httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
     }
@@ -92,19 +93,19 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     public void configure(WebSecurity web) throws Exception {
         // AuthenticationTokenFilter will ignore the below paths
         web.ignoring()
-                .antMatchers("/auth/**")
+           .antMatchers("/auth/**")
 
-                // allow anonymous resource requests
-                .and()
-                .ignoring()
-                .antMatchers(
-                        HttpMethod.GET,
-                        "/",
-                        "/*.html",
-                        "/**/favicon.ico",
-                        "/**/*.html",
-                        "/**/*.css",
-                        "/**/*.js"
-                );
+           // allow anonymous resource requests
+           .and()
+           .ignoring()
+           .antMatchers(
+                   HttpMethod.GET,
+                   "/",
+                   "/*.html",
+                   "/**/favicon.ico",
+                   "/**/*.html",
+                   "/**/*.css",
+                   "/**/*.js"
+           );
     }
 }

+ 66 - 0
src/main/java/com/izouma/awesomeAdmin/web/Word2PDFController.java

@@ -0,0 +1,66 @@
+package com.izouma.awesomeAdmin.web;
+
+import com.izouma.awesomeAdmin.exception.BusinessException;
+import com.izouma.awesomeAdmin.utils.FileUtils;
+import com.jacob.activeX.ActiveXComponent;
+import com.jacob.com.Dispatch;
+import org.apache.poi.util.TempFile;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+
+@Controller
+public class Word2PDFController {
+
+    @PostMapping(value = "/word2pdf", produces = "application/pdf")
+    @ResponseBody
+    public byte[] word2pdf(@RequestParam("file") MultipartFile file) {
+        ActiveXComponent app = null;
+
+        System.out.println("开始转换...");
+        // 开始时间
+        long start = System.currentTimeMillis();
+        try {
+            File word = TempFile.createTempFile("word2pdf", "." + FileUtils.getExtension(file.getOriginalFilename()));
+            File target = TempFile.createTempFile("word2pdf", ".pdf");
+            FileUtils.write(file.getInputStream(), word);
+
+            // 打开word
+            app = new ActiveXComponent("Word.Application");
+            // 设置word不可见,很多博客下面这里都写了这一句话,其实是没有必要的,因为默认就是不可见的,如果设置可见就是会打开一个word文档,对于转化为pdf明显是没有必要的
+            //app.setProperty("Visible", false);
+            // 获得word中所有打开的文档
+            Dispatch documents = app.getProperty("Documents").toDispatch();
+            System.out.println("打开文件: " + word.getPath());
+            // 打开文档
+            Dispatch document = Dispatch.call(documents, "Open", word.getPath(), false, true).toDispatch();
+            // 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在
+            if (target.exists()) {
+                target.delete();
+            }
+            System.out.println("另存为: " + target.getPath());
+            // 另存为,将文档报错为pdf,其中word保存为pdf的格式宏的值是17
+            Dispatch.call(document, "SaveAs", target.getPath(), 17);
+            // 关闭文档
+            Dispatch.call(document, "Close", false);
+            // 结束时间
+            long end = System.currentTimeMillis();
+            System.out.println("转换成功,用时:" + (end - start) + "ms");
+
+            return org.apache.commons.io.FileUtils.readFileToByteArray(target);
+        } catch (Exception e) {
+            e.getMessage();
+            System.out.println("转换失败" + e.getMessage());
+            throw new BusinessException("转换失败" + e.getMessage());
+        } finally {
+            // 关闭office
+            app.invoke("Quit", 0);
+        }
+
+    }
+}

+ 49 - 6
src/test/java/com/izouma/awesomeAdmin/CommonTest.java

@@ -3,6 +3,8 @@ package com.izouma.awesomeAdmin;
 import com.izouma.awesomeAdmin.domain.BaseEntity;
 import com.izouma.awesomeAdmin.domain.User;
 import com.izouma.awesomeAdmin.web.BaseController;
+import com.jacob.activeX.ActiveXComponent;
+import com.jacob.com.Dispatch;
 import lombok.SneakyThrows;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.text.CaseUtils;
@@ -93,7 +95,7 @@ public class CommonTest {
         AffineTransform affinetransform = new AffineTransform();
         FontRenderContext frc = new FontRenderContext(affinetransform, true, true);
         Font font = Font.createFont(Font.TRUETYPE_FONT, this.getClass()
-                .getResourceAsStream("/font/SourceHanSansCN-Normal.ttf"));
+                                                            .getResourceAsStream("/font/SourceHanSansCN-Normal.ttf"));
         System.out.println((int) (font.deriveFont(14f).getStringBounds("aaa", frc).getWidth()));
     }
 
@@ -111,24 +113,24 @@ public class CommonTest {
         StringBuilder idxJs = new StringBuilder();
         for (Class<? extends Enum> entity : entitySet) {
             idxJs.append("import ").append(entity.getSimpleName()).append(" from \"./").append(entity.getSimpleName())
-                    .append("\";\n");
+                 .append("\";\n");
             StringBuilder str = new StringBuilder("export default {\n");
             for (Enum enumConstant : entity.getEnumConstants()) {
                 str.append("    ").append(enumConstant.name()).append(": \"").append(enumConstant.name())
-                        .append("\",\n");
+                   .append("\",\n");
             }
             str.append("}");
             Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "vue", "src", "constants", entity
                     .getSimpleName() + ".js"), str.toString()
-                    .getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
+                                                  .getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
             Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "zmj_mp", "src", "constants", entity
                     .getSimpleName() + ".js"), str.toString()
-                    .getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
+                                                  .getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
         }
         idxJs.append("export default {\n");
         for (Class<? extends Enum> entity : entitySet) {
             idxJs.append("    ").append(entity.getSimpleName()).append(": ").append(entity.getSimpleName())
-                    .append(",\n");
+                 .append(",\n");
         }
         idxJs.append("}");
         System.out.println(idxJs.toString());
@@ -172,4 +174,45 @@ public class CommonTest {
         FileCopyUtils.copy(out, new File("/Users/drew/Desktop/111.jpg"));
         System.out.println(out);
     }
+
+    @Test
+    public void testword2pdf() {
+        ActiveXComponent app = null;
+        String wordFile = "C:\\Users\\xiong\\Downloads\\文件正文.doc";
+        String pdfFile = "C:\\Users\\xiong\\Downloads\\文件正文.pdf";
+
+        System.out.println("开始转换...");
+        // 开始时间
+        long start = System.currentTimeMillis();
+        try {
+            // 打开word
+            app = new ActiveXComponent("Word.Application");
+            // 设置word不可见,很多博客下面这里都写了这一句话,其实是没有必要的,因为默认就是不可见的,如果设置可见就是会打开一个word文档,对于转化为pdf明显是没有必要的
+            //app.setProperty("Visible", false);
+            // 获得word中所有打开的文档
+            Dispatch documents = app.getProperty("Documents").toDispatch();
+            System.out.println("打开文件: " + wordFile);
+            // 打开文档
+            Dispatch document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch();
+            // 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在
+            File target = new File(pdfFile);
+            if (target.exists()) {
+                target.delete();
+            }
+            System.out.println("另存为: " + pdfFile);
+            // 另存为,将文档报错为pdf,其中word保存为pdf的格式宏的值是17
+            Dispatch.call(document, "SaveAs", pdfFile, 17);
+            // 关闭文档
+            Dispatch.call(document, "Close", false);
+            // 结束时间
+            long end = System.currentTimeMillis();
+            System.out.println("转换成功,用时:" + (end - start) + "ms");
+        } catch (Exception e) {
+            e.getMessage();
+            System.out.println("转换失败" + e.getMessage());
+        } finally {
+            // 关闭office
+            app.invoke("Quit", 0);
+        }
+    }
 }