Apache 的POI居然还能操作PPT,快来试试看

news2024/9/22 17:37:02

上次我们讲的用POI操作excel。Java操作Excel(Apache Poi详解)
那么java怎么操作ppt呢,其实poi也提供了操作ppt的sdk,现在我们来直接用Apache的poi操作ppt
首先我们要知道的是PPT有两种,一种格式是PPT,一种格式是PPTX,PPTX就是2007年之后的新的PPT协议。也就是说PPT和PPTX是PowerPoint的两种文件格式,PPT为旧版本格式,PPTX为新版本格式。 PPTX具有更好的兼容性、更小的文件大小、更高的安全性和更丰富的功能,而PPT格式功能相对简单。

所以在POI里面也有两种不同的sdk去操作对应的两种格式。在官网的介绍中可以得知,使用hslf操作ppt格式,使用xslf操作pptx格式

在这里插入图片描述

那么我们现在就介绍一下poi操作ppt的一些sdk

第一步,导入依赖

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>5.2.5</version>
        </dependency>

第二步就可以开始使用sdk了,我们先来看pptx格式的sdk

添加图片

package com.example.aivideo.test3;

import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class addpic {
    public static void main(String[] args) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("C:\\Users\\PC\\Documents\\test2.pptx"));
        XSLFSlide slide = ppt.createSlide();
        byte[] pictureData = IOUtils.toByteArray(new FileInputStream("C:\\Users\\PC\\Pictures\\Saved Pictures\\d5e28fc20a5a41e8997691134bed79f4.png"));
        XSLFPictureData pd = ppt.addPicture(pictureData, PictureData.PictureType.PNG);
        XSLFPictureShape pic = slide.createPicture(pd);

        FileOutputStream out = new FileOutputStream("slideshow2.ppt");
        ppt.write(out);
        out.close();

    }
}

读取一个PPTX文件,向其中添加一张来自指定路径的PNG图片,然后将含有新图片的幻灯片保存为另一个PPT文件。它使用Apache POI库操作PPTX文件。

添加一张幻灯片

package com.example.aivideo.test3;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class append {

    public static void main(String[] args) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("C:\\Users\\PC\\Documents\\test2.pptx"));
//append a new slide to the end
        XSLFSlide blankSlide = ppt.createSlide();
        FileOutputStream out = new FileOutputStream("slideshow3.ppt");
        ppt.write(out);
        out.close();
    }
}

将一个已存在的PPTX演示文稿进行扩展。它首先打开一个名为"test2.pptx"的文件,然后在该文稿的末尾添加一个新的空白幻灯片。添加新幻灯片后,程序将整个修改后的演示文稿保存到名为"slideshow3.ppt"的新文件中。

添加有内容的幻灯片

package com.example.aivideo.test3;

import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class appendnew {
    public static void main(String[] args) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("C:\\Users\\PC\\Documents\\test2.pptx"));
// first see what slide layouts are available :
        System.out.println("Available slide layouts:");
        for(XSLFSlideMaster master : ppt.getSlideMasters()){
            for(XSLFSlideLayout layout : master.getSlideLayouts()){
                System.out.println(layout.getType());
            }
        }
// blank slide
        XSLFSlide blankSlide = ppt.createSlide();
// there can be multiple masters each referencing a number of layouts
// for demonstration purposes we use the first (default) slide master
        XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0);
// title slide
        XSLFSlideLayout titleLayout = defaultMaster.getLayout(SlideLayout.TITLE);
// fill the placeholders
        XSLFSlide slide1 = ppt.createSlide(titleLayout);
        XSLFTextShape title1 = slide1.getPlaceholder(0);
        title1.setText("First Title");
// title and content
        XSLFSlideLayout titleBodyLayout = defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
        XSLFSlide slide2 = ppt.createSlide(titleBodyLayout);
        XSLFTextShape title2 = slide2.getPlaceholder(0);
        title2.setText("Second Title");
        XSLFTextShape body2 = slide2.getPlaceholder(1);
        body2.clearText(); // unset any existing text
        body2.addNewTextParagraph().addNewTextRun().setText("First paragraph");
        body2.addNewTextParagraph().addNewTextRun().setText("Second paragraph");
        body2.addNewTextParagraph().addNewTextRun().setText("Third paragraph");

        FileOutputStream out = new FileOutputStream("slideshow2.ppt");
        ppt.write(out);
        out.close();
    }
}

这里打开了一个现有的PowerPoint文件(“C:\Users\PC\Documents\test2.pptx”),查看可用的幻灯片布局,并创建了三个新幻灯片,每个幻灯片使用不同的布局。第一个幻灯片是一个空白幻灯片,第二个幻灯片是一个只有标题的幻灯片,第三个幻灯片是一个包含标题和内容的幻灯片。最后,该程序将修改后的PowerPoint文件保存为"slideshow2.ppt"。

删除幻灯片

package com.example.aivideo.test3;

import org.apache.poi.xslf.usermodel.XMLSlideShow;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class delete {
    public static void main(String[] args) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("C:\\Users\\PC\\Documents\\test2.pptx"));
        ppt.removeSlide(2); // 0-based index of a slide to be removed
        FileOutputStream out = new FileOutputStream("slideshow3.ppt");
        ppt.write(out);
        out.close();
    }
}

注意这里的索引是从0开始的哦,如果大家有把一个大ppt按每一页切割成一个小的ppt可以使用下面的方案去切割:

package com.example.aivideo.split;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * 最终版
 */
public class SplitPPT {
    public static void main(String[] args) throws Exception {
        FileInputStream stream = new FileInputStream("C:\\Users\\PC\\Documents\\A.pptx");

        XMLSlideShow ppt = new XMLSlideShow(stream);
        int numSlides = ppt.getSlides().size();
        System.out.println(numSlides);

        for (int i = 0; i < numSlides; i++) {
            // 删除新PPT中除了当前幻灯片之外的其他幻灯片
            for (int j = numSlides - 1; j >= 0; j--) {
                if (j != i) {
                    ppt.removeSlide(j);
                }
            }

            // 输出为单个ppt
            FileOutputStream out = new FileOutputStream("te9_" + (i + 1) + ".pptx");
            ppt.write(out);
            out.close();

            // 恢复原始幻灯片列表,以便下一次循环
            stream = new FileInputStream("C:\\Users\\PC\\Documents\\A.pptx");
            ppt = new XMLSlideShow(stream);
        }

        ppt.close();
    }
}

或者你也可以使用这种复制的方案:

package com.example.aivideo.split;

import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 最终版
 */
public class SplitPPTcopy {
    public static void main(String[] args) throws Exception {
        try (FileInputStream stream = new FileInputStream("C:\\Users\\PC\\Documents\\A.pptx");
             XMLSlideShow ppt = new XMLSlideShow(stream);) {


            int numSlides = ppt.getSlides().size();
            List<XSLFSlideMaster> slideMasters = ppt.getSlideMasters();
            List<XSLFSlideLayout> xslfSlideLayouts = new ArrayList<>();
            slideMasters.forEach(master -> {
                xslfSlideLayouts.addAll(Arrays.asList(master.getSlideLayouts()));
            });
            System.out.println(numSlides);

            for (int i = 0; i < numSlides; i++) {
                try (XMLSlideShow newPPT = new XMLSlideShow();
                     FileOutputStream out = new FileOutputStream("test_" + (i + 1) + ".pptx");) {

                    newPPT.setPageSize(ppt.getPageSize());
                    // 复制当前页到新的PPT对象中
                    XSLFSlide slide = ppt.getSlides().get(i);
                    XSLFSlide newPPTSlide = newPPT.createSlide();
                    newPPTSlide.importContent(slide);
                    xslfSlideLayouts.forEach(slideLayout -> {
                        slideLayout.copyLayout(newPPTSlide);
                    });
                    // 输出为单个ppt
                    newPPT.write(out);
                }
            }


        }
    }
}

但是这种会出现格式丢失的情况,如果对ppt里面的内容要求不高,允许丢失数据,可以使用这种方案,这种方案会比上面的方案更节省资源和加快速度。

添加超链接

package com.example.aivideo.test3;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFHyperlink;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextBox;
import org.apache.poi.xslf.usermodel.XSLFTextRun;

import java.io.FileOutputStream;
import java.io.IOException;

public class hyperlink {

    public static void main(String[] args) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow();
        XSLFSlide slide = ppt.createSlide();

// assign a hyperlink to a text run
        XSLFTextBox shape = slide.createTextBox();
        XSLFTextRun r = shape.addNewTextParagraph().addNewTextRun();
        r.setText("Apache POI");
        XSLFHyperlink link = r.createHyperlink();
        link.setAddress("https://poi.apache.org");

//save changes
        FileOutputStream out = new FileOutputStream("slideshow3.ppt");
        ppt.write(out);
        out.close();
    }
}

创建一个PowerPoint文件,并在其中的幻灯片上添加一个指向Apache POI官网的超链接文本"Apache POI",然后保存为"slideshow3.ppt"文件。

合并ppt

package com.example.aivideo.test3;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Merge {

    public static void main(String[] args) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow();
        String[] inputs = {"C:\\Users\\PC\\Documents\\test2.pptx", "C:\\Users\\PC\\Documents\\test.pptx"};
        for(String arg : inputs){
            FileInputStream is = new FileInputStream(arg);
            XMLSlideShow src = new XMLSlideShow(is);
            is.close();
            for(XSLFSlide srcSlide : src.getSlides()){
                ppt.createSlide().importContent(srcSlide);
            }
        }
        FileOutputStream out = new FileOutputStream("merged.pptx");
        ppt.write(out);
        out.close();
    }
}

合并多个PowerPoint文件。它打开每个输入文件,遍历其中的每张幻灯片,并将它们导入到一个新的PowerPoint演示文稿中。最后,它将合并后的演示文稿保存为一个新文件。这种就是我们上面说到的复制方案,但是会丢一些动画和格式。

读取ppt内容

package com.example.aivideo.test3;

import org.apache.poi.sl.usermodel.PlaceableShape;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFConnectorShape;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

import java.io.FileInputStream;
import java.io.IOException;

public class read {
    public static void main(String[] args) throws IOException {

        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("C:\\Users\\PC\\Documents\\test2.pptx"));
// get slides
        for (
                XSLFSlide slide : ppt.getSlides()) {
            for (XSLFShape sh : slide.getShapes()) {
                // name of the shape
                String name = sh.getShapeName();
                // shapes's anchor which defines the position of this shape in the slide
                if (sh instanceof PlaceableShape) {
                    java.awt.geom.Rectangle2D anchor = ((PlaceableShape) sh).getAnchor();
                }
                if (sh instanceof XSLFConnectorShape) {
                    XSLFConnectorShape line = (XSLFConnectorShape) sh;
                    // work with Line
                } else if (sh instanceof XSLFTextShape) {
                    XSLFTextShape shape = (XSLFTextShape) sh;
                    String text = shape.getText();
                    System.out.println(text);
                    // work with a shape that can hold text
                } else if (sh instanceof XSLFPictureShape) {
                    XSLFPictureShape shape = (XSLFPictureShape) sh;
                    // work with Picture
                }
            }
        }
    }
}

遍历每张幻灯片中的所有形状。它识别形状类型(如文本框、图片、线条等),然后对他们进行操作。

读取ppt里面的图片

package com.example.aivideo.test3;

import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class readpic {
    public static void main(String[] args) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("C:\\Users\\PC\\Documents\\test2.pptx"));

        for(XSLFPictureData data : ppt.getPictureData()){
            byte[] bytes = data.getData();
            String fileName = data.getFileName();
            System.out.println(fileName);
        }


    }
}

对了,就是标题的意思,poi提供了读取ppt里面所有图片的sdk。

改变幻灯片的位置

package com.example.aivideo.test3;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class Reorder {
    public static void main(String[] args) throws IOException {

        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("C:\\Users\\PC\\Documents\\test2.pptx"));
        List<XSLFSlide> slides = ppt.getSlides();
        XSLFSlide thirdSlide = slides.get(2);
        ppt.setSlideOrder(thirdSlide, 0); // move the third slide to the beginning

        FileOutputStream out = new FileOutputStream("slideshow2.ppt");
        ppt.write(out);
        out.close();
    }
}

重新排列幻灯片的顺序,然后将修改后的演示文稿保存到新的文件中。

改变ppt的长宽

package com.example.aivideo.test3;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class Rewir {
    public static void main(String[] args) throws IOException {


        XMLSlideShow ppt = new XMLSlideShow(new FileInputStream("C:\\Users\\PC\\Documents\\test2.pptx"));

        //retrieve page size. Coordinates are expressed in points (72 dpi)
        java.awt.Dimension pgsize = ppt.getPageSize();
        int pgx = pgsize.width; //slide width in points
        int pgy = pgsize.height; //slide height in points
        System.out.println("page size: " + pgx + "x" + pgy);
//set new page size
        ppt.setPageSize(new java.awt.Dimension(1024, 768));


        FileOutputStream out = new FileOutputStream("slideshow2.ppt");
        ppt.write(out);
        out.close();
    }
}

在这里插入图片描述

读取一个PowerPoint文件(test2.pptx),获取其页面大小,然后设置新的页面大小为1024x768像素,并将修改后的PowerPoint文件保存为slideshow2.ppt。
在这里插入图片描述

往幻灯片里面添加文本框

package com.example.aivideo.test3;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextBox;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;

import java.awt.*;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class text {
    public static void main(String[] args) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow();
        XSLFSlide slide = ppt.createSlide();
        XSLFTextBox shape = slide.createTextBox();
        XSLFTextParagraph p = shape.addNewTextParagraph();
        XSLFTextRun r1 = p.addNewTextRun();
        r1.setText("The");
        r1.setFontColor(Color.blue);
        r1.setFontSize(24.);
        XSLFTextRun r2 = p.addNewTextRun();
        r2.setText(" quick");
        r2.setFontColor(Color.red);
        r2.setBold(true);
        XSLFTextRun r3 = p.addNewTextRun();
        r3.setText(" brown");
        r3.setFontSize(12.);
        r3.setItalic(true);
        r3.setStrikethrough(true);
        XSLFTextRun r4 = p.addNewTextRun();
        r4.setText(" fox");

        FileOutputStream out = new FileOutputStream("slideshow2.ppt");
        ppt.write(out);
        out.close();
    }
}

生成一个PPT文件,包含一个幻灯片和一个文本框。文本框内有不同格式的文字(如蓝色、红色、加粗、斜体、删除线)。

随后,关于PPT格式的部分我就不再赘述了,各位可以直接去官网查看更具体的信息。当然,这个文件有两种阅读方式,如果用旧的hslf去读取pptx格式的文件会出现错误,但如果我们将其输出,无论是用hslf还是xslf,都能输出为PPTx或PPT格式,这样就不会出现错误了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1966980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Seata的使用

Seata Seata是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。 术语 TC(Transaction Coordinator) -事务协调者&#xff08;相当于服务端&#xff09; 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚 TM(Transaction …

使用Python实现Excel文件首页截图工具

日常工作中&#xff0c;尤其是处理大量Excel文件时&#xff0c;可能需要对文件的首页进行截图保存&#xff0c;以便于后续的快速查看或报告编写。今天&#xff0c;我将分享一个用Python编写的Excel文件首页截图工具。这个工具将帮助我们自动化地对选定的Excel文件进行首页截图&…

Linux驱动入门—什么是驱动?体系结构,驱动的分类,开发驱动需要注意的问题

文章目录 什么是驱动&#xff1f;Linux系统体系结构用户空间与内核空间的隔离用户应用程序库函数用户空间守护进程命令行接口&#xff08;CLI&#xff09;图形用户界面&#xff08;GUI&#xff09; 内核空间内核的角色和职责内核空间与用户空间的区别内核的结构和组成内核空间的…

【Linux】网络架构探秘:网络层功能、IP协议详解及路由过程指南

文章目录 前言&#xff1a;1. 网络层是干什么的&#xff1f;2. IP协议2.1 理论铺垫2.2 IP协议的头格式2.3 网段划分&#xff08;重点&#xff09;2.3.1 分类划分法&#xff1a;2.3.2 子网掩码&#xff1a;2.3.3 为什么要经行子网划分? 2.4 特殊的IP地址2.5 IP地址的数量限制2.…

个人量化交易兴起!有什么好用的量化软件推荐?迅投QMT量化平台简介!

QMT是专门为机构、活跃投资者、高净值客户等专业投资者研发的智能量化交易终端&#xff0c;拥有高速行情、极速交易、策略交易、多维度风控等专业功能&#xff0c;满足专业投资者的特殊交易需求。覆盖业务范围广:沪深A股、港股通、两融、期权、期货。 适合用QMT的投资者&#x…

用Java手写jvm之模拟解释器执行指令码

写在前面 本文看下如何模拟解释器执行指令码。需要一些前置内容&#xff1a; 用Java手写jvm之系列 中的前4篇文章&#xff0c;当然如果你已经了解了这部分内容&#xff0c;也可以不看。 1&#xff1a;正文 既然是模拟解释器&#xff0c;我们肯定要先来定义一个解释器类了&am…

一个灵活、可扩展的开源问答平台,可用于社区论坛、帮助中心、知识管理等多种场景

大家好&#xff0c;今天给大家分享的是一个开源的问答平台软件Apache Incubator-Answer&#xff0c;由 SegmentFault 思否团队于 2022 年 10 月 24 日正式开源&#xff0c;并于同年入选 Apache 软件基金会孵化器。 项目介绍 Apache Incubator-Answer旨在为任何规模的团队提供一…

【C语言版】数据结构教程(一)绪论(上)

【内容简介】本文整理数据结构&#xff08;C语言版&#xff09;相关内容的复习笔记&#xff0c;供各位朋友借鉴学习。本章内容更偏于记忆和理解&#xff0c;请读者们耐心阅读。 数据结构教程 绪论&#xff08;上&#xff09; 本节学习目标 1.1 基本概念 1.2 抽象数据类型的表示…

苹果电脑怎么录制屏幕?3招教你轻松录制,高效实用

随着数字化时代的快速发展&#xff0c;屏幕录制已经成为我们日常工作和生活中不可或缺的一部分。它不仅是展示产品、教授知识、分享经验的重要工具&#xff0c;更是我们展现个性和创造力的新舞台。在苹果电脑上&#xff0c;屏幕录制功能的应用更是将这一体验推向了新的高度。 …

优思学院|不良产品留到客户产线上了,8D报告要如何写?

8D问题解决法是一个经常用作公司内部改善以及应付客户投诉的关键方法&#xff0c;不过&#xff0c;在改善的过程中却有一些误区&#xff0c;如果没有注意&#xff0c;那么这份8D报告将会变得徒劳无功。这里有一个这样的案例&#xff1a; 一个经验丰富的工程师把客户图纸看错了&…

【面向PM考试】挣值分析的计算场景介绍

前言 PM考试目前还是挺火热的&#xff0c;有些人是因为行业所需&#xff0c;有些人是因为自身学习&#xff0c;总而言之&#xff0c;需要经过系统的学习&#xff0c;才能胜任当下的工作。 关于挣值分析&#xff0c;包括一些基础概念&#xff0c;博主有一篇文章已详细介绍&…

基于ip/域名/端口的server配置、nodej项目、部署nfs服务器

回顾复习 jdk环境 tomcat服务器需要jdk环境 版本对应 tomcat>jdk17 tomcat9>jdk1.8 tomvat10>jdk17 1、配置系统变量 JAVA_HOME sed -i $aexport JAVA_HOME/usr/local/jdk22/ /etc/profile sed -i $aexport PATH$JAVA_HOME/bin:$PATH /etc/profile sour…

猫用空气净化器应该如何挑选?国内养猫空气净化器哪个好?

有没有友友跟我一样是鼻炎患者&#xff0c;可偏偏家里两只猫都是掉毛怪&#xff0c;行走的大型蒲公英&#xff0c;多猫家庭确实很快乐&#xff0c;但一到换毛季&#xff0c;家里地上、空气里全是猫毛。每天都需要拼命的吸地板&#xff08;累鼠个人&#xff09;&#xff0c;毛一…

金牌九宫格!经常跑步的人,没有一个是弱者——早读(逆天打工人爬取热门微信文章解读)

我在学习龙头战法&#xff0c;有了解的吗&#xff1f; 引言Python 代码第一篇 洞见 经常跑步的人&#xff0c;没有一个是弱者第二篇 今天尝试结尾 引言 时间是什么&#xff1f; 我越来越觉得是一个限定 因为没有时间 我们很多事情就有点乱套 你说你的 我说我的 十分混乱 没有一…

Matplotlib面积图绘制秘籍:让你的数据‘膨胀’起来,但不吹泡泡哦!

1. 引言 嘿&#xff0c;数据迷们&#xff01;想不想让你的数据‘活’起来&#xff0c;跳一曲色彩斑斓的面积舞&#xff1f;Matplotlib面积图&#xff0c;不只是数字的堆砌&#xff0c;它是故事的讲述者&#xff0c;让复杂数据变得一目了然&#xff0c;还带点小幽默。快来一探究…

第1天:Python基础语法(五)

正文&#xff1a; 在之前的文章中&#xff0c;我们已经学习了Python的基本语法集合和集合的一些常用操作。 在本篇文章中&#xff0c;我们将继续学习其他类型 字符串格式化 使用操作符%s来实现 ➢ 几个%s就几个变量 ➢ 超过一个变量时&#xff0c;需要用元组%&#xff08;…

SpringBoot SseEmitter,服务器单项消息推送

防止推送消息乱码 import org.jetbrains.annotations.NotNull; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.servlet.mvc.method…

阿里云实时计算Flink在多行业的应用和实践

摘要&#xff1a;本文整理自 Flink Forward Asia 2023 中闭门会的分享。主要分享实时计算在各行业的应用实践&#xff0c;对回归实时计算的重点场景进行介绍以及企业如何使用实时计算技术&#xff0c;并且提供一些在技术架构上的参考建议。内容分为以下四个部分&#xff1a; 业…

Magic-PDF:端到端PDF文档解析神器 构建高质量RAG必备!

项目结构 流程解析 预处理的作用是判断文档内容是否需要进行OCR识别&#xff0c;如果是普通可编辑的PDF文档&#xff0c;则使用PyMuPDF库提取元信息。 模型层除了常规的OCR、版面结构分析外&#xff0c;还有公式检测模型&#xff0c;可提取公式内容&#xff0c;用于后续把公式…

Ubuntu系统在两个屏幕上都显示任务栏

Ubuntu系统在两个屏幕上都显示任务栏 目标 希望在两个屏幕&#xff08;主屏和扩展屏&#xff09;上都显示下图的状态栏 解决方法 打开设置&#xff0c;找到>外观>Dock 2. 将显示于改成所有显示