Si java combina dos contenidos de palabras de acuerdo con el marco

paquete com.ruoyi.survey.test; 

importar org.apache.poi.openxml4j.opc.OPCPackage; 
importar org.apache.poi.openxml4j.util.ZipSecureFile; 
importar org.apache.poi.xwpf.usermodel.Document; 
importar org.apache.poi.xwpf.usermodel.XWPFDocument; 
importar org.apache.poi.xwpf.usermodel.XWFPPictureData; 
importar org.apache.xmlbeans.XmlOptions; 
importar org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; 

importar java.io.Archivo; 
importar java.io.FileInputStream; 
importar java.io.FileOutputStream; 
importar java.io.OutputStream; 
importar java.util.*; 


public class DocxMerge { 
    public static void main(String[] args) { 
// Consulta todos los archivos que deben fusionarse en la carpeta
// String basePath="D:\\data\\.work\\0530\\declaration file"; 
// String[] list=new File(basePath).list(); 
// for (String s:list ) { 
// String a=s.substring(0,s.indexOf(".")-1); 
// String b=s.substring(0,s.indexOf(".")-8); 
            System.out .println(a); 
// System.out.println(b); 
// Archivo file1 = new File("D:\\data\\.work\\0530\\after merging\\"+b+". docx "); 
// List<File> targetFile1 = new ArrayList<>(); 
// targetFile1.add(new File("D:\\data\\.work\\0530\\declaration file\\"+ a+" 4.docx")); 
// targetFile1.add(new File("D:\\data\\.work\\0530\\declaration file\\"+a+"5.docx")); 
// 
// appendDocx(file1, targetFile1); 
// 
// }
// System.out.println("Fusionar con éxito!!!"); 

//Fusionar un 
        archivo file1 = new File("D:\\data\\.work\\0530\\after merging\\3.docx" ); 
        List<File> targetFile1 = new ArrayList<>(); 
        targetFile1.add(new File("D:\\data\\.work\\0530\\declaration file\\SQ2022YFC3800142_xm_sqs_zw_part2_4.docx")); 
        targetFile1 . add(new File("D:\\data\\.work\\0530\\declaration document\\SQ2022YFC3800142_xm_sqs_zw_part2_5.docx")); 

        appendDocx(file1, targetFile1); 
        System.out.println("¡Fusionar correctamente! !! \n"); 


    } 

    /** 
     * Combinar varios archivos docx en uno 

     * @param outfile archivo de salida 
     * @param targetFile archivo de destino 
     */
    public static void appendDocx(File outfile, List<File> targetFile) { 
        try { 

            OutputStream dest = new FileOutputStream(outfile); 
            ArrayList<XWPFDocument> documentList = new ArrayList<>(); 
            XWPFDocumento doc = nulo; 
            for (int i = 0; i < targetFile.size(); i++) { 
                ZipSecureFile.setMinInflateRatio(-1.0d); 
                FileInputStream in = new FileInputStream(targetFile.get(i).getPath()); 
                OPCPackage abierto = OPCPackage.open(in); 
                documento XWPFDocument = nuevo XWPFDocument(abierto); 
                listadedocumentos.add(documento); 
            } 
            for (int i = 0; i < documentList.size(); i++) { 
                doc = documentList.get(0); 
                if (i != 0) { 
                    //Solución Después de fusionar la palabra, todas las tablas están juntas sin paginación. Agregar un salto de página puede resolver 
                    documentList.get(i).createParagraph().setPageBreak(true); documentList.get(i).createParagraph() 
            . 
                    appendBody(doc, documentList.get(i)); 
                } 
            doc.write(dest); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
    public static void appendBody(XWPFDocument src, XWPFDocument append) throws Exception { 
        CTBody src1Body = src.getDocument().getBody();

        CTBody src2Body = append.getDocument().getBody(); 

        List<XWPFPictureData> allPictures = append.getAllPictures(); 
        // Registrar ID de imágenes antes y después de fusionar 
        Map<String, String> map = new HashMap<>() ; 
        for (XWFPPictureData picture: allPictures) { 
    private static void appendBody(CTBody src, CTBody append, Map<String, String> map) throws Exception { 
            String before = append.getRelationId(picture); 
            //Agregue las imágenes del documento original al documento de destino
            String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG); 
            map.put(before, after); 
        } 
        //Este código resuelve principalmente el problema de fusionar errores de palabras, analizar y lanzar bombas de compresión 
        ZipSecureFile.setMinInflateRatio( -1.0d ); 
        appendBody(src1Body, src2Body, map); 

    } 

        XmlOptions optionsOuter = new XmlOptions(); 
        optionsOuter.setSaveOuter(); 
        String appendString = append.xmlText(optionsOuter); 

        String srcString = src.xmlText(); 
        String prefijo = srcString.substring(0, srcString. indexOf(">") + 1); 
        String mainPart = srcString.substring(srcString. indexOf(">") + 1, srcString. lastIndexOf("<")); 
        String sufix = srcString.substring(srcString.lastIndexOf("<")); 
        String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<")); // 
        La siguiente parte se puede eliminar, la razón por la que agregué es que al fusionar, a veces hay un break Si no se abre, puede abrirlo normalmente eliminando algunas etiquetas según document.xml 
        addPart = addPart.replaceAll("w14:paraId=\"[A-Za-z0-9]{1,10}\ "", ""); 
        addPart = addPart.replaceAll("w14:textId=\"[A-Za-z0-9]{1,10}\"", ""); 
        addPart = addPart.replaceAll("w :rsidP=\"[A-Za-z0-9]{1,10}\"", "");
        addPart = addPart.replaceAll("w:rsidRPr=\"[A-Za-z0-9]{1,10}\"", ""); 
        addPart = addPart.replace("<w:footerReference r:id=\"rId9\" w:type=\"default\"/>",""); 
        addPart = addPart.replace("xsi:nil=\"true\"","");

        if (map != null && !map.isEmpty()) { 
            //Reemplace el ID de la imagen en la cadena xml 
            por (Map.Entry<String, String> set : map.entrySet()) { 
                addPart = addPart.replace(set.getKey(), set.getValue()); 
            } 
        } 
        //Concatenar el contenido xml de dos documentos 
        CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix); 

        src.set(makeBody); 
    } 


}



Supongo que te gusta

Origin blog.csdn.net/m0_57666466/article/details/130952027
Recomendado
Clasificación