chillqi 3 лет назад
Родитель
Сommit
5d06bc8f3f

+ 100 - 0
pom.xml

@@ -108,6 +108,13 @@
             <artifactId>httpmime</artifactId>
             <version>4.5.2</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.artofsolving</groupId>
+            <artifactId>jodconverter</artifactId>
+            <version>2.2.1</version>
+        </dependency>
+
     </dependencies>
 
     <dependencyManagement>
@@ -156,6 +163,99 @@
                 <version>${jjwt.version}</version>
                 <scope>runtime</scope>
             </dependency>
+
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi</artifactId>
+                <version>4.1.2</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>4.1.2</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-scratchpad</artifactId>
+                <version>4.1.2</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.itextpdf</groupId>
+                <artifactId>itextpdf</artifactId>
+                <version>5.4.3</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.itextpdf</groupId>
+                <artifactId>itext-asian</artifactId>
+                <version>5.2.0</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.docx4j</groupId>
+                <artifactId>docx4j</artifactId>
+                <version>3.2.2</version>
+            </dependency>
+
+            <!-- 从外面导包进来 项目的myJar com.aspose -->
+
+            <!-- 下面的依赖是为了报其他错误的 -->
+            <dependency>
+                <groupId>org.apache.xmlbeans</groupId>
+                <artifactId>xmlbeans</artifactId>
+                <version>5.0.3</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml-schemas</artifactId>
+                <version>4.1.2</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-compress</artifactId>
+                <version>1.19</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-collections4</artifactId>
+                <version>4.1</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.zaxxer</groupId>
+                <artifactId>SparseBitSet</artifactId>
+                <version>1.2</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>5.6.0</version>
+            </dependency>
+
+            <!-- 修改com.aspose.cells专用包 -->
+            <!--<dependency>-->
+            <!--<groupId>org.javassist</groupId>-->
+            <!--<artifactId>javassist</artifactId>-->
+            <!--<version>3.26.0-GA</version>-->
+            <!--</dependency>-->
+            <dependency>
+                <groupId>org.apache.pdfbox</groupId>
+                <artifactId>fontbox</artifactId>
+                <version>2.0.18</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.pdfbox</groupId>
+                <artifactId>pdfbox</artifactId>
+                <version>2.0.18</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <type>pom</type>
+                <version>2.4.4</version>
+                <scope>import</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 11 - 0
seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/CourseWareVO.java

@@ -23,6 +23,8 @@ public class CourseWareVO {
 
     private ObjectState state;
 
+    private Boolean canDownload;
+
     public Long getId() {
         return id;
     }
@@ -103,6 +105,14 @@ public class CourseWareVO {
         this.state = state;
     }
 
+    public Boolean getCanDownload() {
+        return canDownload;
+    }
+
+    public void setCanDownload(Boolean canDownload) {
+        this.canDownload = canDownload;
+    }
+
     @Override
     public String toString() {
         return "CourseWareVO{" +
@@ -116,6 +126,7 @@ public class CourseWareVO {
                 ", useMethod=" + useMethod +
                 ", fileUrl=" + fileUrl +
                 ", state=" + state +
+                ", canDownload=" + canDownload +
                 '}';
     }
 

+ 10 - 0
seecoder-portal-server/pom.xml

@@ -157,6 +157,16 @@
             <artifactId>commons-io</artifactId>
             <version>2.4</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>3.8</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>4.1.2</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 13 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/domain/CourseWare.java

@@ -54,6 +54,10 @@ public class CourseWare {
     @NotNull
     private ObjectState state;
 
+    @Column
+    @NotNull
+    private Boolean canDownload;
+
     public String getFileUrl() {
         return fileUrl;
     }
@@ -134,6 +138,14 @@ public class CourseWare {
         this.state = state;
     }
 
+    public Boolean getCanDownload() {
+        return canDownload;
+    }
+
+    public void setCanDownload(Boolean canDownload) {
+        this.canDownload = canDownload;
+    }
+
     @Override
     public String toString() {
         return "CourseWare{" +
@@ -147,6 +159,7 @@ public class CourseWare {
                 ", useMethod=" + useMethod +
                 ", fileUrl=" + fileUrl +
                 ", state=" + state +
+                ", canDownload=" + canDownload +
                 '}';
     }
 

+ 8 - 2
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/CourseWareService.java

@@ -1,5 +1,6 @@
 package cn.seecoder.seecoderportalserver.service;
 
+import cn.hutool.log.StaticLog;
 import cn.seecoder.seecoderportalcommon.vo.CourseWareVO;
 import cn.seecoder.seecoderportalcommon.vo.dto.CourseWareDTO;
 import org.springframework.core.io.ByteArrayResource;
@@ -7,9 +8,12 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
 import java.io.IOException;
+import java.net.URL;
 import java.util.List;
 
 public interface CourseWareService {
@@ -26,10 +30,12 @@ public interface CourseWareService {
 
     CourseWareVO getCourseWareById(Long id);
 
-//    String downloadCourseWare(HttpServletRequest req, HttpServletResponse res, Long id) throws IOException;
-
     String changeCourseWareName(Long id, String name);
 
     String getCourseWareUrlById(Long id);
 
+    void preview(HttpServletResponse response, String filePath);
+
+    Long getCourseIdById(Long id);
+
 }

+ 127 - 44
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/CourseWareServiceImpl.java

@@ -1,25 +1,32 @@
 package cn.seecoder.seecoderportalserver.serviceImpl;
 
-import cn.seecoder.seecoderportalcommon.vo.*;
+import cn.hutool.log.StaticLog;
+import cn.seecoder.seecoderportalcommon.vo.CourseWareVO;
+import cn.seecoder.seecoderportalcommon.vo.ObjectState;
 import cn.seecoder.seecoderportalcommon.vo.dto.CourseWareDTO;
-import cn.seecoder.seecoderportalserver.domain.Course;
 import cn.seecoder.seecoderportalserver.domain.CourseWare;
 import cn.seecoder.seecoderportalserver.mapper.CourseWareMapper;
 import cn.seecoder.seecoderportalserver.repository.CourseRepository;
 import cn.seecoder.seecoderportalserver.repository.CourseWareRepository;
 import cn.seecoder.seecoderportalserver.service.CourseWareService;
 import cn.seecoder.seecoderportalserver.utility.OssUtil;
-import com.aliyun.oss.model.GetObjectRequest;
-import com.aliyun.oss.model.OSSObject;
-import org.checkerframework.checker.units.qual.C;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
+//import org.apache.poi.hslf.usermodel.*;
+//import org.apache.poi.xslf.usermodel.*;
+import org.apache.poi.hslf.usermodel.*;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.awt.image.BufferedImage;
 import java.io.*;
+import java.net.URL;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -89,7 +96,15 @@ public class CourseWareServiceImpl implements CourseWareService {
     public String uploadCourseWareFile(String name, MultipartFile file) {
         try {
             System.out.println("upload");
-            System.out.println(name);
+//            if (name.substring(name.indexOf(".")).equals(".ppt")) {
+//                OutputStream pdfFile = null;
+//                FileOutputStream fileOutputStream = new FileOutputStream(name.substring(0, name.indexOf(".")) + ".pdf");
+//                pptToPdf(file.getInputStream(), fileOutputStream);
+//                ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream();
+//
+//                String courseWareUrl = ossUtil.upload(name, );
+//
+//            }
             String courseWareUrl = ossUtil.upload(name, file.getInputStream());
             System.out.println(courseWareUrl);
             return courseWareUrl;
@@ -98,43 +113,74 @@ public class CourseWareServiceImpl implements CourseWareService {
         }
     }
 
-//    @Override
-//    public String downloadCourseWare(HttpServletRequest req, HttpServletResponse res, Long id) throws IOException {
-//        System.out.println("download");
-//        CourseWare courseWare = courseWareRepository.findCourseWareById(id);
-//        String fileName = courseWare.getName();
-//        String filePath = courseWare.getFileUrl();
-//
-//        OutputStream os = null;
-//        InputStream is = null;
-//        try{
-//            res.reset();
-//            res.setCharacterEncoding("utf-8");
-//            res.setContentType("application/octet-stream");
-//            res.setHeader("Content-Disposition", "attachment;" + new String(fileName.getBytes("gb2312"), "ISO8859-1"));
-//            File f = new File(filePath);
-//            is = new FileInputStream(f);
-//            ServletOutputStream sout = res.getOutputStream();
-//            BufferedInputStream bis = null;
-//            BufferedOutputStream bos = null;
-//            bis = new BufferedInputStream(is);
-//            bos = new BufferedOutputStream(sout);
-//            byte[] buff = new byte[2048];
-//            int bytesRead;
-//            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
-//                bos.write(buff, 0, bytesRead);
-//            }
-//            bos.flush();
-//            bos.close();
-//            bis.close();
-//            is.close();
-//            os.close();
-//        }catch (Exception e){
-//
-//        }
+    public static boolean pptToPdf(InputStream inputStream, OutputStream outputStream) {
+
+        Document document = null;
+        HSLFSlideShow hslfSlideShow = null;
+        PdfWriter pdfWriter = null;
+
+        try {
+            hslfSlideShow = new HSLFSlideShow(inputStream);
+
+            // 获取ppt文件页面
+            Dimension dimension = hslfSlideShow.getPageSize();
+
+            document = new Document();
+
+            // pdfWriter实例
+            pdfWriter = PdfWriter.getInstance(document, outputStream);
+
+            document.open();
+
+            PdfPTable pdfPTable = new PdfPTable(1);
+
+            List<HSLFSlide> hslfSlideList = hslfSlideShow.getSlides();
+
+            for (int i=0; i < hslfSlideList.size(); i++) {
+                HSLFSlide hslfSlide = hslfSlideList.get(i);
+//                // 设置字体, 解决中文乱码
+//                for (HSLFShape shape : hslfSlide.getShapes()) {
+//                    HSLFTextShape textShape = (HSLFTextShape) shape;
 //
-//        return fileName;
-//    }
+//                    for (HSLFTextParagraph textParagraph : textShape.getTextParagraphs()) {
+//                        for (HSLFTextRun textRun : textParagraph.getTextRuns()) {
+//                            textRun.setFontFamily("宋体");
+//                        }
+//                    }
+//                }
+                BufferedImage bufferedImage = new BufferedImage((int)dimension.getWidth(), (int)dimension.getHeight(), BufferedImage.TYPE_INT_RGB);
+
+                Graphics2D graphics2d = bufferedImage.createGraphics();
+
+                graphics2d.setPaint(Color.white);
+                graphics2d.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12));
+
+                hslfSlide.draw(graphics2d);
+
+                graphics2d.dispose();
+
+                Image image = Image.getInstance(bufferedImage, null);
+                image.scalePercent(50f);
+
+                // 写入单元格
+                pdfPTable.addCell(new PdfPCell(image, true));
+                document.add(image);
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        } finally {
+            if (document != null) {
+                document.close();
+            }
+            if (pdfWriter != null) {
+                pdfWriter.close();
+            }
+        }
+        System.out.println("ppt转换完毕");
+        return true;
+    }
 
     @Override
     public String changeCourseWareName(Long id, String newName) {
@@ -156,4 +202,41 @@ public class CourseWareServiceImpl implements CourseWareService {
         return courseWare.getFileUrl();
     }
 
+    @Override
+    public void preview(HttpServletResponse response, String filePath) {
+        ServletOutputStream out;
+        BufferedInputStream buf;
+        try {
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition", "inline;fileName=" + filePath.substring(filePath.lastIndexOf("/") + 1));
+            URL url = new URL(filePath);
+            //使用输入读取缓冲流读取一个文件输入流
+            buf = new BufferedInputStream(url.openStream());
+            //利用response获取一个字节流输出对象
+            out = response.getOutputStream();
+            //定义个数组,由于读取缓冲流中的内容
+            byte[] buffer = new byte[1024];
+            int n;
+            //while循环一直读取缓冲流中的内容到输出的对象中
+            while ((n = buf.read(buffer)) != -1) {
+                out.write(buffer, 0, n);
+            }
+            //写出到请求的地方
+            out.flush();
+            buf.close();
+            out.close();
+        } catch (IOException e) {
+            StaticLog.error("ExportFileUtil.download() IOException", e);
+        } catch (Exception e) {
+            StaticLog.error("Exception", e);
+        }
+    }
+
+    @Override
+    public Long getCourseIdById(Long id) {
+        CourseWare courseWare = courseWareRepository.findCourseWareById(id);
+        return courseWare.getCourseId();
+    }
+
 }

+ 118 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/utility/FilePdfUtil.java

@@ -0,0 +1,118 @@
+package cn.seecoder.seecoderportalserver.utility;
+
+import com.artofsolving.jodconverter.DocumentConverter;
+import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
+import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
+import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
+//import com.ruoyi.common.utils.StringUtils;
+
+import java.io.*;
+import java.net.ConnectException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class FilePdfUtil {
+//    /**
+//     * 转换文件成pdf
+//     *
+//     * @param fromFileInputStream:
+//     * @throws IOException
+//     */
+//    public static String file2pdf(InputStream fromFileInputStream, String type,String pdfPath) throws IOException {
+//        Date date = new Date();
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+//        String timesuffix = sdf.format(date);
+//        String docFileName = null;
+//        String htmFileName = null;
+//        if("doc".equals(type)){
+//            docFileName = "doc_" + timesuffix + ".doc";
+//            htmFileName = "doc_" + timesuffix + ".pdf";
+//        }else if("docx".equals(type)){
+//            docFileName = "docx_" + timesuffix + ".docx";
+//            htmFileName = "docx_" + timesuffix + ".pdf";
+//        }else if("xls".equals(type)){
+//            docFileName = "xls_" + timesuffix + ".xls";
+//            htmFileName = "xls_" + timesuffix + ".pdf";
+//        }else if("ppt".equals(type)){
+//            docFileName = "ppt_" + timesuffix + ".ppt";
+//            htmFileName = "ppt_" + timesuffix + ".pdf";
+//        }else if("xlsx".equals(type)){
+//            docFileName = "xlsx_" + timesuffix + ".xlsx";
+//            htmFileName = "xlsx_" + timesuffix + ".pdf";
+//        }else if("pptx".equals(type)){
+//            docFileName = "pptx_" + timesuffix + ".pptx";
+//            htmFileName = "pptx_" + timesuffix + ".pdf";
+//        }else{
+//            return null;
+//        }
+//
+//
+//        check_folder(pdfPath);
+//
+//        File htmlOutputFile = new File(pdfPath + File.separatorChar + htmFileName);
+//        File docInputFile = new File(pdfPath + File.separatorChar + docFileName);
+//        if (htmlOutputFile.exists())
+//            htmlOutputFile.delete();
+//        htmlOutputFile.createNewFile();
+//        if (docInputFile.exists())
+//            docInputFile.delete();
+//        docInputFile.createNewFile();
+//        /**
+//         * 由fromFileInputStream构建输入文件
+//         */
+//        try {
+//            OutputStream os = new FileOutputStream(docInputFile);
+//            int bytesRead = 0;
+//            byte[] buffer = new byte[1024 * 8];
+//            while ((bytesRead = fromFileInputStream.read(buffer)) != -1) {
+//                os.write(buffer, 0, bytesRead);
+//            }
+//
+//            os.close();
+//            fromFileInputStream.close();
+//        } catch (IOException e) {
+//        }
+//
+//        OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
+//        try {
+//            connection.connect();
+//        } catch (ConnectException e) {
+//            System.err.println("文件转换出错,请检查OpenOffice服务是否启动。");
+//        }
+//
+//        DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
+//        converter.convert(docInputFile, htmlOutputFile);
+//        connection.disconnect();
+//        // 转换完之后删除word文件
+//        docInputFile.delete();
+//        System.out.println(htmFileName);
+//        return htmFileName;
+//    }
+//
+//    public static void check_folder(String path) {
+//        File dir = new File(path);
+//        // 判断文件夹是否存在
+//        if (dir.isDirectory()) {
+//        } else {
+//            dir.mkdirs();
+//        }
+//    }
+//
+//    public static void copyFile(String oldPath, String newPath) throws IOException {
+//        File oldFile = new File(oldPath);//获取旧的文件File对象
+//        File file = new File(newPath + oldFile.separator + StringUtils.substringAfterLast(oldPath, "/"));  //获取新的文件File对象并生成文件
+//        FileInputStream in = new FileInputStream(oldFile);  //
+//        FileOutputStream out = new FileOutputStream(file);
+//
+//        byte[] buffer=new byte[2097152];
+//        int readByte = 0;
+//        //读取旧文件的流写入新文件里
+//        while((readByte = in.read(buffer)) != -1){
+//            out.write(buffer, 0, readByte);
+//        }
+//
+//        in.close();
+//        out.close();
+//    }
+
+}

+ 12 - 17
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/CourseWareController.java

@@ -5,6 +5,7 @@ import cn.seecoder.seecoderportalcommon.vo.dto.CourseWareDTO;
 import cn.seecoder.seecoderportalserver.domain.CourseWare;
 import cn.seecoder.seecoderportalserver.service.CourseWareService;
 import cn.seecoder.seecoderportalserver.utility.OkResponse;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
@@ -12,12 +13,15 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import org.apache.commons.io.IOUtils;
+
+import java.net.URLEncoder;
 import java.util.List;
 
 @RestController
@@ -71,22 +75,13 @@ public class CourseWareController {
         return OkResponse.of(courseWareService.getCourseWareUrlById(id));
     }
 
-//    @RequestMapping(name = "/showPdf")
-//    public String showPdf(HttpServletRequest request, HttpServletResponse response, String pdfUrl) {
-//        try {
-//            pdfUrl = pdfUrl.trim();
-//            URL url = new URL(pdfUrl);
-//            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-//            conn.setConnectTimeout(5*1000);
-//            InputStream inputStream = conn.getInputStream();
-//            response.setHeader("Content-Disposition", "attachment;fileName=show.pdf");
-//            response.setContentType("multipart/form-data");
-//            OutputStream outputStream = response.getOutputStream();
-//            IOUtils.write(IOUtils.toByteArray(inputStream), outputStream);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//        return null;
-//    }
+    @GetMapping("/readPdfFile")
+    public void previewPdf(HttpServletResponse response, String fileUrl){
+        courseWareService.preview(response, fileUrl);
+    }
 
+    @GetMapping("/getCourseIdById")
+    public OkResponse<Long> getCourseIdById(@RequestParam Long id) {
+        return OkResponse.of(courseWareService.getCourseIdById(id));
+    }
 }

+ 1 - 1
seecoder-portal-server/src/main/resources/application-dev.yml

@@ -9,7 +9,7 @@ spring:
   datasource:
     url: jdbc:postgresql://localhost:5432/portal
     username: postgres
-    password: 123456
+    password: postgres
 #    username: postgres
 #    password: postgres
 

+ 3 - 1
seecoder-portal-server/src/main/resources/portal.sql

@@ -246,7 +246,9 @@ CREATE TABLE IF NOT EXISTS public.course_ware (
     created_time timestamp without time zone NOT NULL,
     use_time character varying(255) NOT NULL,
     use_method character varying(255) NOT NULL,
-    file_url character varying(255) NOT NULL
+    file_url character varying(255) NOT NULL,
+    state character varying(255) NOT NULL,
+    can_download boolean NOT NULL
 );