国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

高亮img、pdf重點(diǎn)部分(html2canvas、pdfjs-dist、react-pdf)

這篇具有很好參考價(jià)值的文章主要介紹了高亮img、pdf重點(diǎn)部分(html2canvas、pdfjs-dist、react-pdf)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

可用業(yè)務(wù)場(chǎng)景

報(bào)銷單據(jù)審批中,高亮發(fā)票部分

需求

后臺(tái)返回一張圖片或者pdf、返回一組坐標(biāo),坐標(biāo)類型[number,number,number,number],分別代表了x、y、width、height。需要根據(jù)坐標(biāo)在圖片上高亮出來(lái)坐標(biāo)位置。如下圖
高亮的坐標(biāo)是:

const rect: Rect[] = [
  [100, 100, 200, 200],
  [200, 300, 200, 200],
];

高亮img、pdf重點(diǎn)部分(html2canvas、pdfjs-dist、react-pdf),React技術(shù)棧相關(guān),pdf,react.js,前端
高亮img、pdf重點(diǎn)部分(html2canvas、pdfjs-dist、react-pdf),React技術(shù)棧相關(guān),pdf,react.js,前端

技術(shù)選型

  • dom轉(zhuǎn)成圖片:html2canvas
  • pdf預(yù)覽:pdfjs-dist、react-pdf
  • 遮照:純css實(shí)現(xiàn)(四個(gè)絕對(duì)定位的dom)

這里的react-pdf使用的是V4,用來(lái)兼容IE11
遮照也可以換成是一個(gè)矩形框,看具體需求,我這里的需求是遮照高亮

代碼

組件部分

/*
 * @Author: Do not edit
 * @Date: 2023-08-25 13:48:06
 * @LastEditors: atwlee
 * @LastEditTime: 2023-08-28 14:08:34
 * @Descripttion:
 * @FilePath: /test/src/pages/generate.tsx
 */

import { FC, useEffect, useRef } from "react";
import styles from "./index.modules.less";
import html2canvas from "html2canvas";
import { Document, Page, pdfjs } from "react-pdf";

pdfjs.GlobalWorkerOptions.workerSrc = new URL(
  "pdfjs-dist/build/pdf.worker.min.js",
  import.meta.url
).toString();

export type Rect = [number, number, number, number];

interface GenerateProps {
  fileUrl: string;
  rects: Rect[];
  onGenerateCallback: (imgs: string[]) => void;
  fileType: "img" | "pdf";
  fileSize?: [number, number];
}

const Index: FC<GenerateProps> = (props) => {
  const { fileUrl, rects, onGenerateCallback, fileType, fileSize } = props;
  const divRef = useRef<HTMLDivElement>(null);

  const handleGenerateImg = () => {
    const results: string[] = [];
    rects.forEach((item, index) => {
      html2canvas(
        divRef.current!.querySelector(`[data-key="generate${index}"]`)!,
        {
          useCORS: true,
        }
      ).then((canvas) => {
        results.push(canvas.toDataURL("image/png"));
        results.length === rects.length && onGenerateCallback(results);
      });
    });
  };

  const pdf2img = useRef<string[]>([]);
  const onPageLoadSuccess = () => {
    rects.forEach((item, index) => {
      html2canvas(
        divRef.current!.querySelector(`[data-key="generate${index}"]`)!,
        {
          useCORS: true,
        }
      ).then((canvas) => {
        pdf2img.current.push(canvas.toDataURL("image/png"));
        if (pdf2img.current.length === rects.length) {
          onGenerateCallback(pdf2img.current);
          pdf2img.current = [];
        }
      });
    });
  };

  useEffect(() => {
    fileType === "img" && handleGenerateImg();
  }, [fileUrl, rects, fileType]);

  return (
    <div ref={divRef} className={styles.contanier}>
      {/* pdf */}
      {fileType === "pdf" && (
        <Document file={fileUrl}>
          {rects.map((i, index) => (
            <div
              className={styles.rectItem}
              key={index}
              data-key={`generate${index}`}
            >
              <Page
                pageNumber={1}
                width={fileSize?.[0]}
                height={fileSize?.[1]}
                onRenderSuccess={onPageLoadSuccess}
              />
              <div className={styles.coverTop} style={{ height: i[1] }} />
              <div
                className={styles.coverRight}
                style={{
                  left: i[0] + i[2],
                  top: i[1],
                  height: i[3],
                }}
              />
              <div
                className={styles.coverBottom}
                style={{ top: i[1] + i[3] }}
              />
              <div
                className={styles.coverLeft}
                style={{ width: i[0], top: i[1], height: i[3] }}
              />
            </div>
          ))}
        </Document>
      )}

      {/* img */}
      {fileType === "img" &&
        rects.map((i, index) => (
          <div
            className={styles.rectItem}
            key={index}
            data-key={`generate${index}`}
          >
            <img src={fileUrl} width={fileSize?.[0]} height={fileSize?.[1]} />
            <div className={styles.coverTop} style={{ height: i[1] }} />
            <div
              className={styles.coverRight}
              style={{
                left: i[0] + i[2],
                top: i[1],
                height: i[3],
              }}
            />
            <div className={styles.coverBottom} style={{ top: i[1] + i[3] }} />
            <div
              className={styles.coverLeft}
              style={{ width: i[0], top: i[1], height: i[3] }}
            />
          </div>
        ))}
    </div>
  );
};

export default Index;

使用

/*
 * @Author: Do not edit
 * @Date: 2023-08-24 15:57:05
 * @LastEditors: atwlee
 * @LastEditTime: 2023-08-28 14:13:37
 * @Descripttion:
 * @FilePath: /test/src/pages/index.tsx
 */
import { useState } from "react";
import Generate from "./generate";
import type { Rect } from "./generate";
import yayJpg from "./yay.jpg";
import pdfUrl from "./redv2.pdf";

const rect: Rect[] = [
  [100, 100, 200, 200],
  [200, 300, 200, 200],
];

export default function HomePage() {
  const [imgs, setImgs] = useState<string[]>([]);
  const onGenerateCallback = (img: string[]) => {
    setImgs(img);
  };

  const hiddenStyle = { height: 0, overflow: "hidden" };

  return (
    <div>
      <h2>Yay! Welcome to umi!</h2>
      <div style={hiddenStyle}>
        <Generate
          // fileType="pdf"
          fileType="img"
          // fileUrl={pdfUrl}
          // fileUrl={'https://www.sdta.cn/pdf/e-map.pdf'}
          fileUrl={yayJpg}
          // fileUrl={
          //   "https://img1.baidu.com/it/u=2488875768,1454762303&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800"
          // }
          rects={rect}
          onGenerateCallback={onGenerateCallback}
        />
      </div>
      {imgs.map((i, index) => {
        return <img src={i} key={index} alt="" />;
      })}
    </div>
  );
}

demo源碼

PS

圖片的話不用在意實(shí)際的寬度和高度,當(dāng)然如果有更好。pdf不知道需不需要實(shí)際的寬度和高度,這里拋出去了fileSize的屬性,demo里沒(méi)有使用,沒(méi)有測(cè)試。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-688805.html

到了這里,關(guān)于高亮img、pdf重點(diǎn)部分(html2canvas、pdfjs-dist、react-pdf)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vue使用html2canvas將DOM節(jié)點(diǎn)生成對(duì)應(yīng)的PDF

    要通過(guò)Vue使用html2canvas將DOM節(jié)點(diǎn)生成對(duì)應(yīng)的PDF,您需要安裝html2canvas和jspdf這兩個(gè)庫(kù)。html2canvas用于將DOM節(jié)點(diǎn)轉(zhuǎn)換為Canvas,而jspdf用于將Canvas轉(zhuǎn)換為PDF。以下是一個(gè)簡(jiǎn)單的示例代碼,展示了如何使用html2canvas和jspdf生成PDF文件: 首先,安裝html2canvas和jspdf依賴: 然后,在Vue組件中

    2024年02月11日
    瀏覽(22)
  • 純前端--原生js將html頁(yè)面變成pdf文件(html2canvas+jsPDF)

    1、將文檔放在本地,用原生js進(jìn)行引用和使用。 ① 新建一個(gè)名為 html2canvas.min.js 的文件,并且將線上的內(nèi)容進(jìn)行復(fù)制。 ② 引入 js 文件: 2、使用 npm 進(jìn)行安裝使用: 待續(xù)。。。 github 中文網(wǎng)站 CDN Jspdf.es.js:ES 2015 模塊格式。 Jspdf.umd.js:UMD模塊格式,用于 AMD 或腳本標(biāo)簽加載

    2024年02月08日
    瀏覽(22)
  • vue2如何將頁(yè)面生成 pdf 導(dǎo)出 html2Canvas + jspdf

    vue2如何將頁(yè)面生成 pdf 導(dǎo)出 html2Canvas + jspdf

    npm i html2canvas npm i jspdf import html2canvas from \\\'html2canvas\\\'; import jsPDF from \\\'jspdf\\\' export const htmlToPDF = async (htmlId, title = \\\"報(bào)表\\\", bgColor = \\\"#fff\\\") = { ? let pdfDom = document.getElementById(htmlId) ? pdfDom.style.padding = \\\'0 10px !important\\\' ? const A4Width = 595.28; ? const A4Height = 841.89; ? let canvas = await html2canvas(pd

    2024年02月16日
    瀏覽(24)
  • (vue)Vue項(xiàng)目中使用jsPDF和html2canvas生成PDF

    (vue)Vue項(xiàng)目中使用jsPDF和html2canvas生成PDF

    效果: 1.:安裝jsPDF和html2canvas 2.在需要生成PDF文檔的組件中引入jsPDF和html2canvas 解決參考: 1.https://www.jianshu.com/p/31d37bef539b 2.https://www.php.cn/faq/556634.html 3.https://blog.csdn.net/m0_54967474/article/details/123820384

    2024年02月10日
    瀏覽(22)
  • 前端生成pdf之html2canvas+jsPDF,以及解決圖片不顯示bug

    開(kāi)發(fā)背景: 需要給頁(yè)面中相應(yīng)的內(nèi)容生成pdf,查找文檔后發(fā)現(xiàn)要用到兩個(gè)插件。html2canvas 以及 jsPDF html2canvas 給dom結(jié)構(gòu)轉(zhuǎn)化為canvas,然后生成各種類型圖片 jsPDF 把canvas 生成的圖片url 轉(zhuǎn)化為pdf 參數(shù) image:表示要插入的圖片資源,可以是圖片文件的路徑或者base64編碼字符串。

    2024年02月02日
    瀏覽(28)
  • 使用html2canvas將整個(gè)元素導(dǎo)出為圖片,其中包含svg和img,解決img跟svg導(dǎo)出時(shí)img或svg(canvg處理)不顯示的問(wèn)題,以及相關(guān)優(yōu)化

    使用html2canvas將整個(gè)元素導(dǎo)出為圖片,其中包含svg和img,解決img跟svg導(dǎo)出時(shí)img或svg(canvg處理)不顯示的問(wèn)題,以及相關(guān)優(yōu)化

    目錄 前言 一、準(zhǔn)備 二、解決問(wèn)題 1.將svg跟img轉(zhuǎn)為canvas的方法 2.將base64轉(zhuǎn)換成file文件的方法 3.點(diǎn)擊下載使用方法 1).對(duì)dom沒(méi)有處理,需求只是將圖片導(dǎo)出即可 ?2).涉及對(duì)dom的拖拽,流程圖之類的(需復(fù)制dom,在復(fù)制的dom上進(jìn)行處理) ?三、效果圖如下 查閱很多相關(guān)的文章和

    2024年01月20日
    瀏覽(25)
  • html2Canvas+jsPDF 下載PDF 遇到跨域的對(duì)象存儲(chǔ)的圖片無(wú)法顯示

    html2Canvas+jsPDF 下載PDF 遇到跨域的對(duì)象存儲(chǔ)的圖片無(wú)法顯示

    ? ? 一、問(wèn)題原因? 對(duì)象存儲(chǔ)的域名和你網(wǎng)址的域名不一樣,此時(shí)用Canvas相關(guān)插件 將DOM元素轉(zhuǎn)化為PDF,就會(huì)出現(xiàn)跨域錯(cuò)誤。 二、解決辦法? 兩步 1. 圖片元素上設(shè)置屬性??crossorigin=\\\"anonymous\\\"? 支持原生img和eleme組件 ?2. 存儲(chǔ)桶設(shè)置資源跨域訪問(wèn) 阿里騰訊云為例:↓ 阿里云OS

    2024年02月15日
    瀏覽(19)
  • 【無(wú)標(biāo)題】使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一樣

    【無(wú)標(biāo)題】使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一樣

    問(wèn)題:使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一樣,在mac下,一切正常,看起來(lái)很舒服,但是當(dāng)我把頁(yè)面放在擴(kuò)展屏幕下(27寸),再生成一個(gè)pdf,雖然排版一樣,但是文字就變得非常小 下面的是在mac下的,上面是在擴(kuò)展屏幕下的,最開(kāi)始我以為是文字大

    2024年02月16日
    瀏覽(25)
  • Vue基于html2canvas和jspdf生成pdf文件,解決jspdf中文亂碼及自動(dòng)換行等問(wèn)題

    Vue基于html2canvas和jspdf生成pdf文件,解決jspdf中文亂碼及自動(dòng)換行等問(wèn)題

    在做項(xiàng)目時(shí)有這么一個(gè)需求,需要將當(dāng)前頁(yè)面指定區(qū)域的內(nèi)容導(dǎo)出pdf到本地。借助了兩個(gè)插件分別是html2canvas.js和pdf.js來(lái)實(shí)現(xiàn)。使用過(guò)程中遇到的問(wèn)題及解決方法 解決一些問(wèn)題: 導(dǎo)出按A4紙大小排列 預(yù)留頁(yè)面邊距的問(wèn)題 內(nèi)容過(guò)多自動(dòng)分頁(yè)的問(wèn)題 直接使用jspdf中文亂碼的問(wèn)題

    2024年01月25日
    瀏覽(67)
  • html2canvas使用文檔

    Install NPM Install Yarn 以 vue 舉例,這樣寫起來(lái)比較方便 如果想要將圖片導(dǎo)出,可以這樣寫 名稱 默認(rèn)值 描述 allowTaint false 是否允許跨源圖像污染畫布 backgroundColor #ffffff 畫布背景色(如果在DOM中未指定),為透明設(shè)置null canvas null 用作繪圖基礎(chǔ)的現(xiàn)有畫布元素 foreignObjectRendering

    2024年03月28日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包