test only

https://drive.google.com/viewer?url=https://www.labnol.org/files/word.docx

get image

import React, { useEffect, useState } from 'react';
import mammoth from 'mammoth';
import fileType from 'file-type';

function DocxToHtmlConverter() {
  const [htmlContent, setHtmlContent] = useState('');

  useEffect(() => {
    const convertDocxToHtml = async () => {
      try {
        const response = await fetch('your-document.docx'); // 替换为你的 .docx 文件路径
        const fileArrayBuffer = await response.arrayBuffer();
        const options = { arrayBuffer: fileArrayBuffer };
        const result = await mammoth.extractRawText(options);
        const html = await replaceImages(result.value, fileArrayBuffer);
        setHtmlContent(html);
      } catch (error) {
        console.error('Error converting .docx to HTML:', error);
      }
    };

    convertDocxToHtml();
  }, []);

  const replaceImages = async (html, fileArrayBuffer) => {
    const docxImages = await extractImages(fileArrayBuffer);

    docxImages.forEach((image) => {
      const base64 = arrayBufferToBase64(image.data);
      html = html.replace(image.src, `data:${image.contentType};base64,${base64}`);
    });

    return html;
  };

  const extractImages = async (fileArrayBuffer) => {
    const docxFile = new Uint8Array(fileArrayBuffer);
    const fileTypeResult = await fileType.fromBuffer(docxFile);

    if (fileTypeResult && fileTypeResult.ext === 'docx') {
      const images = await mammoth.extractInlineImageData({ arrayBuffer: fileArrayBuffer });

      return images.map((image) => ({
        src: image.src,
        data: image.image,
        contentType: image.contentType,
      }));
    }

    return [];
  };

  const arrayBufferToBase64 = (buffer) => {
    let binary = '';
    const bytes = new Uint8Array(buffer);
    const len = bytes.byteLength;

    for (let i = 0; i < len; i++) {
      binary += String.fromCharCode(bytes[i]);
    }

    return window.btoa(binary);
  };

  return <div dangerouslySetInnerHTML={{ __html: htmlContent }} />;
}

export default DocxToHtmlConverter;

使用插件将html -> pdf

要在React中使用react-pdf将一段HTML代码转换为PDF,您可以按照以下步骤进行操作:

1. 安装react-pdf:在您的React项目中,使用npm或yarn安装react-pdf库。

   如果使用npm:
   ```
   npm install @react-pdf/renderer
   ```

   或者如果使用yarn:
   ```
   yarn add @react-pdf/renderer
   ```

2. 创建一个React组件:创建一个React组件,用于渲染您要转换为PDF的HTML代码。

   ```javascript
   import React from 'react';
   import { Page, Document, StyleSheet } from '@react-pdf/renderer';

   const MyPDF = () => {
     return (
       <Document>
         <Page>
           {/* 在这里放置您要转换为PDF的HTML代码 */}
           <div>
             <h1>Hello, PDF!</h1>
             <p>This is an example HTML content.</p>
           </div>
         </Page>
       </Document>
     );
   };

   export default MyPDF;
   ```

   在上述示例中,我们创建了一个名为`MyPDF`的React组件。在`<Document>`和`<Page>`组件中,我们可以放置要转换为PDF的HTML代码。在这个例子中,我们简单地放置了一个包含标题和段落的`<div>`。

3. 使用react-pdf渲染PDF:在您的React应用中,您可以使用react-pdf的`<PDFViewer>`组件或`<PDFDownloadLink>`组件来渲染和下载PDF。

   a. 使用`<PDFViewer>`组件:如果您想在应用中直接显示PDF,您可以使用`<PDFViewer>`组件。

   ```javascript
   import React from 'react';
   import { PDFViewer } from '@react-pdf/renderer';
   import MyPDF from './MyPDF';

   const App = () => {
     return (
       <div>
         {/* 在这里放置其他内容 */}
         <PDFViewer>
           <MyPDF />
         </PDFViewer>
       </div>
     );
   };

   export default App;
   ```

   在上述示例中,我们将`<MyPDF>`组件包裹在`<PDFViewer>`组件中,这样就可以在应用中显示PDF。

   b. 使用`<PDFDownloadLink>`组件:如果您想提供一个下载链接,让用户点击下载PDF,您可以使用`<PDFDownloadLink>`组件。

   ```javascript
   import React from 'react';
   import { PDFDownloadLink } from '@react-pdf/renderer';
   import MyPDF from './MyPDF';

   const App = () => {
     return (
       <div>
         {/* 在这里放置其他内容 */}
         <PDFDownloadLink document={<MyPDF />} fileName="mypdf.pdf">
           {({ blob, url, loading, error }) =>
             loading ? 'Loading document...' : 'Download now!'
           }
         </PDFDownloadLink>
       </div>
     );
   };

   export default App;
   ```

   在上述示例中,我们将`<MyPDF>`组件作为`<PDFDownloadLink>`组件的`document`属性传递,并指定要下载的PDF文件名为"mypdf.pdf"。根据`blob`、`url`、`loading`和`error`属性,我们可以在组件中根据下载状态显示相应的内容。

请注意,以上示例是基本的示例,您可以根据自己的需求和具体的HTML代码进行调整和扩展。您可以在`<MyPDF>`组件中放置更复杂的HTML代码,并使用react-pdf提供的其他组件和样式进行更高级的PDF生成和自定义。

方法 1 

要在React中使用Mammoth将Blob类型转换为HTML,您可以按照以下步骤进行操作:

1. 首先,确保您的React项目已经安装了Mammoth。您可以使用以下命令来安装它:
```shell
npm install mammoth
```

2. 在您的React组件文件中,导入Mammoth库:
```javascript
import * as mammoth from "mammoth";
```

3. 创建一个处理Blob转换的函数。这个函数将接受一个Blob对象作为参数,并返回一个Promise,以便在转换完成后进行处理。可以在组件类或函数组件中创建此函数。
```javascript
function convertBlobToHTML(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onloadend = function () {
      const arrayBuffer = reader.result;
      mammoth.extractRawText({ arrayBuffer: arrayBuffer })
        .then((result) => {
          const html = result.value; // 转换后的HTML内容
          resolve(html);
        })
        .catch((error) => {
          reject(error);
        });
    };
    reader.readAsArrayBuffer(blob);
  });
}
```

4. 在您的React组件中,使用上述函数来处理Blob对象:
```javascript
function MyComponent() {
  // 处理Blob转换的函数
  const handleConvertBlob = async (blob) => {
    try {
      const html = await convertBlobToHTML(blob);
      // 在这里可以处理转换后的HTML内容
      console.log(html);
    } catch (error) {
      console.error("转换出错:", error);
    }
  };

  // 示例调用
  const exampleBlob = new Blob([/* Blob数据 */], { type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" });
  handleConvertBlob(exampleBlob);

  return (
    // 组件的JSX内容
  );
}
```

请注意,上述代码仅提供了将Blob转换为HTML的基本逻辑,您可能需要根据具体的需求进行适当的调整和错误处理。同时,您需要确保正确地引入Mammoth库并在项目中包含所需的文件。

方法2 codebox上的

https://codesandbox.io/p/devbox/brave-vaughan-gx8rk?file=%2Fsrc%2Fcomponents%2Fdrivers%2Fdocx-viewer.jsx%3A3%2C1-42%2C1

这段代码是一个React组件,它使用了`mammoth`库来将DOCX文件转换为HTML,并在组件的`componentDidMount`生命周期方法中执行转换操作。

代码分析如下:

1. 导入React和mammoth库:
```javascript
import React, { Component } from 'react';
import mammoth from 'mammoth';
```

2. 导入样式和Loading组件:
```javascript
import 'styles/docx.scss';
import Loading from '../loading';
```

3. 定义一个继承自`Component`的类组件:
```javascript
export default class extends Component {
  // 组件的生命周期方法
  componentDidMount() {
    // 创建一个XMLHttpRequest对象
    const jsonFile = new XMLHttpRequest();
    // 发送GET请求,获取DOCX文件的路径
    jsonFile.open('GET', this.props.filePath, true);
    jsonFile.send();
    jsonFile.responseType = 'arraybuffer';
    jsonFile.onreadystatechange = () => {
      // 检查请求状态和响应状态码
      if (jsonFile.readyState === 4 && jsonFile.status === 200) {
        // 使用mammoth库将DOCX转换为HTML
        mammoth.convertToHtml(
          { arrayBuffer: jsonFile.response },
          { includeDefaultStyleMap: true },
        )
        .then((result) => {
          // 创建一个div元素,并将转换后的HTML内容赋值给innerHTML
          const docEl = document.createElement('div');
          docEl.className = 'document-container';
          docEl.innerHTML = result.value;
          // 将转换后的HTML内容插入到id为'docx'的元素中
          document.getElementById('docx').innerHTML = docEl.outerHTML;
        })
        .catch((a) => {
          console.log('alexei: something went wrong', a);
        })
        .done();
      }
    };
  }

  // 渲染组件
  render() {
    return (
      <div id="docx">
        <Loading />
      </div>);
  }
}
```

此组件的渲染函数(`render`)返回一个`div`元素,其中包含一个id为'docx'的容器元素和一个`Loading`组件。在组件的`componentDidMount`方法中,使用XMLHttpRequest对象获取指定路径的DOCX文件,然后通过`mammoth`库将其转换为HTML。转换完成后,将转换后的HTML内容插入到id为'docx'的容器元素中。

请注意,该代码中的文件路径(`this.props.filePath`)和样式文件路径(`styles/docx.scss`)是需要根据实际情况进行调整的。此外,还需要确保项目中正确引入了`mammoth`库和`Loading`组件的文件。

在react中展示HTML

在React组件中展示HTML内容可以使用`dangerouslySetInnerHTML`属性。这个属性允许您将HTML字符串作为内容插入到组件的DOM元素中,但需要注意潜在的安全风险。

以下是一个示例展示如何在React组件中展示HTML内容:

```javascript
import React from 'react';

function MyComponent() {
  const html = '<p>This is a paragraph.</p>';

  return (
    <div dangerouslySetInnerHTML={{ __html: html }} />
  );
}

export default MyComponent;
```

在上述示例中,我们定义了一个变量`html`,其中包含要展示的HTML内容。然后,我们在`<div>`元素上使用了`dangerouslySetInnerHTML`属性,并将`html`变量设置为`__html`属性的值。这样React会将`html`中的内容作为HTML代码插入到`<div>`元素中。

需要注意的是,`dangerouslySetInnerHTML`属性的命名是有意义的,它提醒我们在使用时要小心,确保插入的HTML内容来自可信的来源,以防止跨站脚本攻击(XSS)等安全问题。请确保您信任并验证要展示的HTML内容,以防止潜在的安全风险。

此外,还可以考虑使用其他库或组件来处理HTML内容的展示和渲染,例如`react-html-parser`或`react-render-html`等库。这些库提供更多的功能和选项,可以更安全地处理和渲染HTML内容。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值