「前端开发」JavaScript 解析各类文本:读取 docx / csv / pdf / pptx 文本信息(解析word文本)

1,624 阅读10分钟

🙏废话不多说系列,直接开整🙏

女11.webp


❀ 本文讲解使用 JavaScript 读取解析不同文件的实际使用案例展示。展示的内容有:

① JavaScript 读取 DOCX 文档;② JavaScript 解析 CSV 文件内容按照 json 格式输出;

③ JavaScript 解析渲染 PDF 文档;④ JavaScript 提取 PDF 文档的内容;

⑤ JavaScript 提取 PPTX 文件内容案例;

❀ 温馨提示:如果想深入了解每一个JS库,可以看附录中对应的官网或开源地址哈,或许对你很有帮助。

一、解析不同文本的方式

(1)【DOCX】mammoth.js 解析 docx 文本信息

【1】mammoth.js 介绍

    Mammoth.js 是一个用于将 Word 文档转换为 HTML 的 JavaScript 库。它特别适合于从 Word 文档中提取内容并以网页格式呈现。以下是一个简单的示例,演示如何使用 Mammoth.js 将 Word 文档转换为 HTML。

【2】使用注意事项和说明

说明

  1. 文件上传:用户可以通过 <input type="file"> 上传一个 .docx 文件。
  2. 文件读取:使用 FileReader API 读取文件内容。
  3. Mammoth.js 转换:使用 mammoth.convertToHtml 方法将 Word 文档转换为 HTML。
  4. 结果展示:将转换后的 HTML 插入到网页中的一个 <div>  元素中。

注意事项

  • 确保你的 Word 文档是  .docx 格式。

  • Mammoth.js 主要关注文档的结构和文本内容,可能无法完美保留所有 Word 文档的格式和样式。

【3】完整演示代码
<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Mammoth.js 示例</title>
        <!-- 引入mammoth CDN -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/mammoth/1.4.2/mammoth.browser.min.js"></script>
    </head>
    <body>
        <input type="file" id="upload" accept=".docx"/>
        <div id="output"></div>

        <script>
            document.getElementById('upload').addEventListener('change', function(event) {
                var reader = new FileReader();
                reader.onload = function(event) {
                    mammoth.convertToHtml({arrayBuffer: event.target.result})
                        .then(displayResult)
                        .catch(handleError);
                };
                reader.readAsArrayBuffer(this.files[0]);
            });

            function displayResult(result) {
                document.getElementById('output').innerHTML = result.value; // 输出 HTML
                console.log(result.messages); // 输出转换过程中的消息
            }

            function handleError(err) {
                console.error(err);
            }
        </script>
    </body>
</html>

测试结果如下:

image.png

(2)【CSV】Papa Parse 解析 CSV 文件

温馨提示:简单点理解 CSV 文件就是 类似 excel 表格文件数据格式,是高效率数据传输的文本格式。

【1】Papa Parse 简介

    Papa Parse 是一个强大的 JavaScript 库,用于解析 CSV(逗号分隔值)文件。它可以在前端轻松地将 CSV 数据转换为 JavaScript 对象。以下是一个简单的示例,展示如何在前端使用 Papa Parse 解析 CSV 文本。

【2】使用注意和说明

1. 说明

  1. 文件上传:用户可以通过**** ****<input type="file"> ****上传一个 .csv 文件。

  2. Papa Parse 解析:使用 Papa.parse ****方法解析上传的 CSV 文件。

    • delimiter: "," :指定分隔符为逗号(可根据需要更改)。
    • header: true 将第一行视为表头。
    • dynamicTyping: true 自动将数字和布尔值转换为相应的 JavaScript 类型。
    • skipEmptyLines: true 跳过空行。
    • transform 在解析每一行数据时,将每个值转换为小写并去除前后空格。
  3. 结果展示:将解析后的数据以 JSON 格式插入到网页中的一个 <pre> 元素中,便于查看。

2. 注意事项

  • 根据 CSV 文件的实际情况,适当配置解析选项。

  • Papa Parse 处理大文件时性能良好,适合用于大数据集的解析。

【3】完整演示代码

准备一份 csv-demo.csv 测试演示文件,输入如下(新建一个 .txt 文件,放入下方数据,再改文件后缀为 .csv 即可,当然,csv文件是可以被office / WPS 软件按照表格的数据格式打开,可别直接将 xlsx文件改为 csv,这样会包含一些xlsx格式存在,而 csv 文件只是高效率的文件传输格式文本类型哈):

StudentID,Name,Age,Gender,FavoriteCourse  
1,Alice,20,Female,Mathematics  
2,Bob,22,Male,Computer Science  
3,Charlie,21,Male,Physics  
4,Diana,20,Female,Biology  
5,Evan,23,Male,Chemistry 
6,诸葛亮,25,男,历史

注意以下几点:

① 是否支持中文解析,如果不行是否修改文件的编码方式为 UTF-8或者统一编码方式;

② 如果 CSV 文件内容最后多了一空行,会出现什么情况?有点你的自己探索哦;

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Papa Parse 示例</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.3.0/papaparse.min.js"></script>
    </head>
    <body>
        <h1>CSV 文件解析示例</h1>
        <input type="file" id="upload" accept=".csv"/>
        <p id="output"></p>
        <!-- 如果需要JSON格式化美丽输出,请使用下方标签即可 -->
        <!-- <pre id="output"></pre> -->

        <script>
            document.getElementById('upload').addEventListener('change', function(event) {
                const file = this.files[0];
                if (file) {
                    Papa.parse(file, {
                        header: true, // 将第一行作为表头
                        dynamicTyping: true, // 自动将数字和布尔值转换为相应类型
                        complete: function(results) {
                            displayResults(results.data);
                        },
                        error: function(error) {
                            console.error("解析错误:", error);
                        }
                    });
                }
            });

            function displayResults(data) {
                // document.getElementById('output').textContent = JSON.stringify(data, null, 2);
                document.getElementById('output').textContent = JSON.stringify(data);
            }
        </script>
    </body>
</html>

测试结果:

image.png

(3)【PDF】PDF.js 解析 PDF 文件

【1】PDF.js 简介

    PDF.js 是一个流行的 JavaScript 库,用于在网页中解析和显示 PDF 文件。以下是一个简单的使用案例,展示如何使用 PDF.js 解析和显示 PDF 文件。GitHub - mozilla/pdf.js: PDF Reader in JavaScript

主要功能】

  1. PDF文件加载:从URL,本地 或者 Blob 对象加载 PDF 文件;
  2. 页面渲染:将 PDF 渲染成 H5 的 元素,支持高质量的图形输出;
  3. 文本提取:能够从PDF文件中提取文本内容,支持文本搜索和选择;
  4. 缩放和旋转:提供页面缩放功能,允许用户调整页面显示大小;支持旋转,一边用户可以查看不同方向的页面;
  5. 支持多种PDF特性:包括书签、注释、链接、表单等。
  6. 自定义UI:自定义用户界面,提供灵活的页面导航和控制
  7. 打印功能: 提供打印 PDF 文件的功能,用户可以直接从浏览器打印当前查看的页面。
  8. 支持大文件:能够处理大的 PDF文件,支持流式加载,提高性能;
  9. 多语言支持:支持多语言文本渲染和显示。

【使用场景】:

  • 在线文档查看器:可以嵌入在网站中,允许用户直接查看 PDF 文件。

  • 电子书阅读器:支持电子书格式的 PDF 文件阅读。

  • 表单填充:可以与表单功能结合,支持在线填写和提交 PDF 表单。

  • 文档管理系统:在企业或组织中,作为文档管理解决方案的一部分。

使用步骤】:

  1. 引入 PDF.js 库:可以直接从 CDN 引入 PDF.js;
  2. 创建 HTML 代码结构:设置一个显示用于显示读取PDF的 元素;
  3. 编写 JavaScript 代码:使用 PDF.js 加载和渲染 PDF文件页面(当然PDF.js 可以读取指定页码)。
【2】使用注意和说明
  • 确保浏览器支持 File API 和 Canvas。

  • PDF.js 需要在 HTTPS 环境下运行,或者在本地使用时需要使用本地服务器(如 http-server、live-server 等)。

  • 可以根据需要调整 scale 参数,以改变渲染的页面大小。

【3】完整演示代码

注意:这一部分只是演示 PDF.js 读取 指定的 PDF 页码 显示,如果需要全面显示则需要 获取 PDF 的全部页码 情况,请继续接下来看。

    <!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>PDF.js 示例</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>
        <style>
            #pdf-canvas {
                border: 1px solid black;
                width: 100%;
                height: auto;
            }
        </style>
    </head>
    <body>
        <h1>PDF.js 示例</h1>
        <input type="file" id="file-input" accept="application/pdf" />
        <canvas id="pdf-canvas"></canvas>

        <script>
            const fileInput = document.getElementById('file-input');
            const canvas = document.getElementById('pdf-canvas');
            const context = canvas.getContext('2d');

            fileInput.addEventListener('change', function(event) {
                const file = event.target.files[0];
                if (file) {
                    const fileReader = new FileReader();

                    fileReader.onload = function() {
                        const typedArray = new Uint8Array(this.result);
                        // 使用 PDF.js 加载 PDF 文件
                        pdfjsLib.getDocument(typedArray).promise.then(function(pdf) {
                            // 获取 PDF 的第一页
                            pdf.getPage(1).then(function(page) {
                                const viewport = page.getViewport({ scale: 1.5 });
                                canvas.width = viewport.width;
                                canvas.height = viewport.height;

                                const renderContext = {
                                    canvasContext: context,
                                    viewport: viewport
                                };
                                // 渲染页面
                                page.render(renderContext);
                            });
                        });
                    };

                    fileReader.readAsArrayBuffer(file);
                }
            });
        </script>
    </body>
</html>

PDF.js 全部显示 PDF 源码演示

  • 全部PDF页面显示注意事项:
    • 渲染所有的页面可能会消耗较多的内存和处理的时间,所以如果是特别大的PDF需要显示,请尽量使用懒加载模式处理。
    • 懒加载模式:通过实现分页和用户滚动滑动的时候一页一页的下载,以提高用户的体验和系统的性能。
  • 全部显示 PK 指定页显示:
    • 关键在于获取 PDF 总页码:获取 PDF 的总页数,通过 pdf.numPages
    • 然后使用循环或者懒加载的方式一页一页依次读取输出。
    <!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PDF.js 全部页面示例</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>
    <style>
        .pdf-canvas {
            border: 1px solid black;
            margin: 10px 0;
            width: 100%;
            height: auto;
        }
    </style>
</head>
<body>
    <h1>PDF.js 全部页面示例</h1>
    <input type="file" id="file-input" accept="application/pdf" />

    <div id="pdf-container"></div>

    <script>
        const fileInput = document.getElementById('file-input');
        const pdfContainer = document.getElementById('pdf-container');

        fileInput.addEventListener('change', function(event) {
            const file = event.target.files[0];
            if (file) {
                const fileReader = new FileReader();

                fileReader.onload = function() {
                    const typedArray = new Uint8Array(this.result);
                    // 使用 PDF.js 加载 PDF 文件
                    pdfjsLib.getDocument(typedArray).promise.then(function(pdf) {
                        const numPages = pdf.numPages; // 获取 PDF 页数
                        console.log('总页数:', numPages);

                        // 遍历每一页并渲染
                        for (let pageNum = 1; pageNum <= numPages; pageNum++) {
                            pdf.getPage(pageNum).then(function(page) {
                                const viewport = page.getViewport({ scale: 1.5 });
                                const canvas = document.createElement('canvas');
                                canvas.className = 'pdf-canvas';
                                pdfContainer.appendChild(canvas);
                                const context = canvas.getContext('2d');
                                canvas.width = viewport.width;
                                canvas.height = viewport.height;

                                const renderContext = {
                                    canvasContext: context,
                                    viewport: viewport
                                };
                                // 渲染页面
                                page.render(renderContext);
                            });
                        }
                    });
                };

                fileReader.readAsArrayBuffer(file);
            }
        });
    </script>
</body>
</html>

实例演示结果:

122.gif

【4】PDF.js 提取 PDF 中的所有文本
(1)说明和注意事项

说明

  • 要使用 PDF.js 提取 PDF 文件中的所有文本信息,可以通过加载 PDF 文件并遍历每一页,使用 getTextContent 方法获取文本内容。

注意事项

  • 提取的文本可能会受到 PDF 文件格式的影响,某些 PDF 文件中的文本可能以图像形式存在,无法提取
  • 如果 PDF 文件包含复杂的布局或多列文本,提取的文本可能不会完全保留原始格式。
  • 可以根据需要对提取的文本进行进一步处理,如保存到文件、搜索等。(说到这里,你是不是知道了如何利用 PDF.js 对 PDF 文件中内容进行搜索判断指定目标文本是否存在呢?)
(2)完整代码演示

实现思路:① 引入PDF文件将其转换为 Unit8Array;

② 使用 pdfjslib.getDocument 加载PDF文件;

③ 获取PDF的总页数,如果需要指定页码获取可以自行改动;

④ 对每一面进行调用 getTextContent 方法,提供文本内容,注意是文本内容哈(再次提醒:图像中的内容文本无法提取);

④ 接着就是按照每一页提取的内容进行组合显示再页面上。

    <!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PDF.js 文本提取示例</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>
</head>
<body>
    <h1>PDF.js 文本提取示例</h1>
    <input type="file" id="file-input" accept="application/pdf" />
    <pre id="text-output"></pre>

    <script>
        const fileInput = document.getElementById('file-input');
        const textOutput = document.getElementById('text-output');

        fileInput.addEventListener('change', function(event) {
            const file = event.target.files[0];
            if (file) {
                const fileReader = new FileReader();

                fileReader.onload = function() {
                    const typedArray = new Uint8Array(this.result);
                    // 使用 PDF.js 加载 PDF 文件
                    pdfjsLib.getDocument(typedArray).promise.then(function(pdf) {
                        const numPages = pdf.numPages; // 获取 PDF 页数
                        let allText = '';

                        // 遍历每一页并提取文本
                        const textPromises = [];
                        for (let pageNum = 1; pageNum <= numPages; pageNum++) {
                            textPromises.push(pdf.getPage(pageNum).then(function(page) {
                                return page.getTextContent().then(function(textContent) {
                                    let pageText = '';
                                    textContent.items.forEach(function(item) {
                                        pageText += item.str + ' '; // 拼接每个文本项
                                    });
                                    return pageText;
                                });
                            }));
                        }

                        // 等待所有页面的文本提取完成
                        Promise.all(textPromises).then(function(pagesText) {
                            allText = pagesText.join('\n\n'); // 将所有页面的文本合并
                            textOutput.textContent = allText; // 显示提取的文本
                        });
                    });
                };

                fileReader.readAsArrayBuffer(file);
            }
        });
    </script>
</body>
</html>

测试结果:

image.png

(4)【PPT】解析 PPTX 文件内容

实现思路:利用第三方插件 PptxGenJS 和 Officegen 以及 jszip 来处理 生成 PPT 和读取PPT 文本;

① PptxGenJS ;② Officegen ; ③ jszip;

注意事项:

  • 提取文本的内容可能会由于 PPT 里面的内容,如存在 图片化中的文字是不可提取到的。
  • 另外,PPT 的文件格式要求为  pptx ,否则无法提取呢;
【1】读取 PPTX 内容
    <!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PPT 内容提取示例</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/officegen/0.4.0/officegen.min.js"></script>
</head>
<body>
    <h1>PPT 内容提取示例</h1>
    <input type="file" id="file-input" accept=".pptx" />
    <pre id="text-output"></pre>

    <script>
        const fileInput = document.getElementById('file-input');
        const textOutput = document.getElementById('text-output');

        fileInput.addEventListener('change', function(event) {
            const file = event.target.files[0];
            if (file) {
                const fileReader = new FileReader();

                fileReader.onload = function() {
                    const data = new Uint8Array(this.result);
                    const zip = new JSZip();

                    zip.loadAsync(data).then(function(zipContent) {
                        let textContent = '';

                        // 遍历 PPTX 文件中的每个 XML 文件
                        const promises = [];
                        Object.keys(zipContent.files).forEach(function(filename) {
                            if (filename.endsWith('.xml')) {
                                promises.push(zipContent.files[filename].async('string').then(function(content) {
                                    // 提取文本内容
                                    const parser = new DOMParser();
                                    const xmlDoc = parser.parseFromString(content, 'application/xml');
                                    const texts = xmlDoc.getElementsByTagName('a:t');
                                    for (let i = 0; i < texts.length; i++) {
                                        textContent += texts[i].textContent + '\n';
                                    }
                                }));
                            }
                        });

                        // 等待所有 XML 文件的处理完成
                        Promise.all(promises).then(function() {
                            textOutput.textContent = textContent; // 显示提取的文本
                        });
                    });
                };

                fileReader.readAsArrayBuffer(file);
            }
        });
    </script>
</body>
</html>

扩展内容:(officegen)

Officegen 功能概述:

  • 生成Microsoft PowerPoint 文档(.pptx 文件):

    • 创建包含一张或多张幻灯片的 PowerPoint 文档。
    • 支持PPT和PPS。
    • 可以创建原生图表。
    • 添加文本块。
    • 添加图像。
    • 可以声明字体、对齐方式、颜色和背景。
    • 可以旋转对象。
    • 支持形状:椭圆、矩形、线条、箭头等。
    • 支持隐藏幻灯片。
    • 支持日期、时间和当前幻灯片编号等自动字段。
    • 支持演讲者笔记。
    • 支持幻灯片布局。
  • 生成Microsoft Word 文档(.docx 文件):

    • 创建Word文档。
    • 可以向文档添加一个或多个段落,并且可以设置字体、颜色、对齐方式等。
    • 可以添加图像。
    • 支持页眉和页脚。
    • 支持书签和超链接。
  • 生成Microsoft Excel 文档(.xlsx 文件):

    • 使用一张或多张工作表创建 Excel 文档。支持带有数字或字符串的单元格。

附录


🙏至此,非常感谢阅读🙏

女11.webp