Grabar un proceso de solución de la función de vista previa en línea del documento

imagen.pngHora: 2021-10-11

1. Requisitos:

Los proyectos de separación de front-end y back-end de Spring boot+vue realizan la función de vista previa del navegador después de cargar el documento

(El archivo se carga en el servidor de archivos minio por adelantado)

Obtenga el flujo de archivos devuelto por el servidor minio a través de la interfaz y procese el flujo de archivos en una vista previa de la página web

2. Ideas:

2.1 La transmisión en PDF se puede previsualizar directamente con el complemento vue-pdf o el complemento pdfjs

2.2 Debido a que el flujo de documentos y el flujo de documentos docx no se pueden previsualizar directamente en el navegador, deben convertirse en flujos de pdf y luego obtener una vista previa.

2.3. Sin embargo, en el proceso de vista previa, hubo un problema de que la vista previa de la transmisión volvía al pdf de front-end después de que docx o doc se convirtió a pdf no podía mostrar caracteres (el pdf convertido se puede mostrar directamente cuando se abre), no No sé qué lo causó, y luego se rindió.

2.4 Dado que todos los archivos convertidos se generan en el directorio especificado, la idea de conversión accede directamente a los archivos de origen a través de nginx y los previsualiza a través de iframe.

3. Código:

[Mover archivos a local]:

/** * 将文件流落成文件到指定目录下 * @param basePath * @param fileDir * @param tbAttachment * @param bytes * @param outputStream * @param bufferedInputStream * @throws Exception */public void toDealSaveFile(String basePath,String fileDir,TbAttachment tbAttachment,byte[] bytes,OutputStream outputStream,BufferedInputStream bufferedInputStream) throws Exception {    //1、创建文件    createFile(basePath+Contexts.SUFFIX_COMMONALITY+Contexts.SUFFIX_FILE,tbAttachment.getAttachmentName(),tbAttachment.getSuffixName());    //2、构建流    File file = new File(fileDir);    outputStream = new FileOutputStream(file);    //3、内容写入流    int i = 0;    while ((i = bufferedInputStream.read(bytes, 0, bytes.length)) != -1) {        outputStream.write(bytes, 0, i);    }    outputStream.flush();    outputStream.close();}
复制代码

[dependencia de pom]:

org.apache.poi poi 3.14 org.apache.poi poi-ooxml 3.14 org.apache.poi poi-scratchpad 3.14 fr.opensagres.xdocreport xdocreport 1.0.6 org.apache.poi poi-ooxml-schemas 3.14 org.apache.poi ooxml-schemas 1.3 com.itextpdf itextpdf 5.5.13 com.itextpdf.tool xmlworker 5.5.11 com.itextpdf itext-asian 5.2.0 org.xhtmlrenderer Flying-saucer-pdf-itext5 9.0.3 org.jsoup jsoup 1.11.3

【Herramientas】: Omitir

[Convertir la palabra del documento completo a pdf]:

pdfPath = basePath+Contexts.SUFFIX_COMMONALITY+Contexts.SUFFIX_FILE+"/"+tbAttachment.getAttachmentName()+Contexts.DIAN+Contexts.SUFFIX_PDF;
String pdfDir = basePath+Contexts.SUFFIX_COMMONALITY+Contexts.SUFFIX_FILE+"/image/";
String docxHtml = "";
//docx和doc转换方式不一样
if(Contexts.SUFFIX_DOCX.equals(tbAttachment.getSuffixName())){
    //docx转html
    docxHtml = PoiItextUtil.docx2Html(docxPath, pdfDir);
}else if(Contexts.SUFFIX_DOC.equals(tbAttachment.getSuffixName())){
    //doc转html
    docxHtml = PoiItextUtil.doc2Html(docxPath, pdfDir);
}else{}
docxHtml = PoiItextUtil.formatHtml(docxHtml);
// 内容替换
//docxHtml = docxHtml.replace("", "");
//html转成pdf
PoiItextUtil.htmlToPdf(docxHtml, pdfPath);
复制代码

[Convierta el archivo en una secuencia y devuélvalo al front-end]

httpServletResponse.setContentType("application/force-download");FileInputStream fileInputStream = null;BufferedInputStream bufferedInputStream = null;OutputStream outputStream = null;
//设置headerhttpServletResponse.addHeader("Content-Disposition", "fileName=" + new String((tbAttachment.getAttachmentName() + "." + tbAttachment.getSuffixName()).getBytes("UTF-8"), "iso-8859-1"));httpServletResponse.addHeader("Access-Control-Expose-Headers", "Content-Disposition");httpServletResponse.addHeader("Content-Length", String.valueOf(tbAttachment.getAttachmentSize()));
File pdfFile = new File(pdfPath);inputStream = new FileInputStream(pdfFile);bufferedInputStream=new BufferedInputStream(inputStream);//将文件流返回给前端展示outputStream = httpServletResponse.getOutputStream();while ((inputStream.read(bytes))!=-1){    outputStream.write(bytes);}inputStream.close();
复制代码

imagen.png

imagen.png

Supongo que te gusta

Origin juejin.im/post/7084040645341347871
Recomendado
Clasificación