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

nodejs實(shí)現(xiàn)解析chm文件列表,無(wú)需轉(zhuǎn)換為PDF文件格式,在線(xiàn)預(yù)覽chm文件以及目錄,不依賴(lài)任何網(wǎng)頁(yè)端插件

這篇具有很好參考價(jià)值的文章主要介紹了nodejs實(shí)現(xiàn)解析chm文件列表,無(wú)需轉(zhuǎn)換為PDF文件格式,在線(xiàn)預(yù)覽chm文件以及目錄,不依賴(lài)任何網(wǎng)頁(yè)端插件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

nodejs實(shí)現(xiàn)解析chm文件列表,無(wú)需轉(zhuǎn)換為PDF文件格式,在線(xiàn)預(yù)覽chm文件以及目錄,不依賴(lài)任何網(wǎng)頁(yè)端插件,Node.js,nodejs,chm解析,在線(xiàn)預(yù)覽chm電子書(shū),chm電子書(shū)


特性:

1、支持任意深度的chm文件解析

2、解析后內(nèi)容結(jié)構(gòu)轉(zhuǎn)換為tree數(shù)據(jù)呈現(xiàn)

3、點(diǎn)擊樹(shù)節(jié)點(diǎn)可以在html實(shí)時(shí)查看數(shù)據(jù)?

4、不依賴(lài)任何瀏覽器端插件,兼容性較好文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-637072.html

nodejs端核心代碼?

const $g = global.SG.$g, fs = global.SG.fs, router = global.SG.router, xlsx = global.SG.xlsx;
module.exports = global.SG.router;

let webRootPath = 'http://127.0.0.1:9999/chm/';//測(cè)試環(huán)境chm文件根目錄

//上傳單個(gè)文件(all方法支持POST、GET、PUT、PATCH、DELETE傳參方式)
let uploadFileName = '';//獲取上傳后的文件名
router.all(
    "/chm/upload",//接口路徑
    $g.dir.upload(
        "./upload",//存儲(chǔ)臨時(shí)上傳文件的路徑
        ({ fileName, } = {}) => { uploadFileName = fileName; }).single("file"),//上傳單個(gè)文件
    (req, res) => {
        // 開(kāi)始解壓上傳的upload文件----------------------------------------
        let cp = require('child_process');
        cp.exec("reg query HKEY_CLASSES_ROOT\\360zip\\shell\\open\\command /ve", function (e, stdout, stderr) {
            let rootPath = `${__dirname.split('\\').slice(0, -3).join('\\')}`;
            let uploadFolderPath = `${rootPath}\\upload\\${uploadFileName}`;
            let targetFolderPath = `${rootPath}\\chm\\${uploadFileName}`;
            let str = stdout.match(/\"([^\"]+)\"/)[0];
            if (str) {
                // console.log('已經(jīng)找到360zip程序,詳細(xì)地址為:'+str);
                cp.exec(`${str} -x ${uploadFolderPath} ${targetFolderPath}`, { encoding: 'binary' }, function (e, stdout, stderr) {
                    // 遍歷讀取目錄里面的文件----------------------------------------
                    let files = [];
                    let walker = require('walk').walk(targetFolderPath, { followLinks: false });
                    walker.on('file', function (roots, stat, next) {
                        if (stat.name.includes(`.hhc`)) {
                            let hhcFilePath = `${roots}/${stat.name}`;
                            files.push(hhcFilePath);
                            fs.readFile(hhcFilePath, 'utf-8', (err, data) => $g.json.res(req, res, "chm文件解析成功", {
                                htmPath: `${webRootPath}${uploadFileName}/`,
                                hhcFilePath: `${webRootPath}${uploadFileName}/${stat.name}`,
                                hhcData: data,
                            }, true));
                        } else next();
                    });
                    walker.on('end', function () {
                        files.length === 0 && $g.json.res(req, res, "沒(méi)有找到hhc文件,請(qǐng)仔細(xì)檢查chm文件是否正確!", { targetFolderPath }, false);
                    });
                });
            } else {
                console.log('沒(méi)有找到360zip程序,無(wú)法完成解壓縮功能,請(qǐng)?jiān)诜?wù)器端安裝360zip軟件!');
            }
        });
    }
);

vue前端核心代碼

<template>
    <div :class="$options.name">
        <div class="sg-left " v-loading="loading">
            <!-- 樹(shù)節(jié)點(diǎn) -->
            <div class="tree-header">
                <!-- 樹(shù)節(jié)點(diǎn) -->
                <div class="tree-header">
                    <div class="sg-left ">
                        <el-tooltip popper-class="sg-el-tooltip" :enterable="false" effect="dark" :content="`支持拖拽到樹(shù)上傳文件`"
                            placement="top-start">
                            <el-button type="text" icon="el-icon-upload" size="mini"
                                @click="d => $refs.sgUpload.triggerUploadFile()">
                                上傳chm文件
                            </el-button>
                        </el-tooltip>
                    </div>
                    <div class="sg-right ">
                    </div>
                </div>
            </div>
            <div class="tree-body" @click="treeData.length === 0 ? $refs.sgUpload.triggerUploadFile() : ''">
                <el-tree ref="tree" @current-change="current_change" :data="treeData"
                    :props="{ label: 'Name', children: 'children' }" :icon-class="'folder-tree-node'" :indent="25"
                    @node-click="nodeClick" node-key="id" :filter-node-method="filterNode" default-expand-all
                    highlight-current :default-expanded-keys="default_expanded_keys">

                    <div slot="reference" class="node-label" slot-scope="{ node, data }">
                        <label class="left" :title="node.label">
                            {{ node.label }}
                        </label>
                    </div>

                </el-tree>
                <sgUpload drag ref="sgUpload" :data="{
                    accept: `.${['chm'].join(',.')}`,
                    // actionUrl: `http://127.0.0.1:9999/api/chm/upload`,
                    actionUrl: `http://xxx.xxxxxx.cn:33/api/chm/upload`,
                    headers: {},
                }" @beforeUpload="beforeUpload" @uploadSuccess="uploadSuccess" @error="uploadError" hideUploadTray />
            </div>
        </div>
        <div class="sg-right ">
            <iframe id="iframe" ref="iframe" :src="src" frameborder="no" style="width:100%;height:100%;"></iframe>
        </div>

        <div class="hhcHTML" ref="hhcHTML" style="display: none;"> </div>
    </div>
</template>
    
<script>
import sgUpload from "@/vue/components/admin/sgUpload";
export default {
    name: 'chmDecode',
    components: {
        sgUpload,
    },
    data() {
        return {
            loading: false,
            htmPath: '',
            src: '',

            current_node: null,
            default_expanded_keys: [],
            treeData: [],
        }
    },
    created() {

    },
    methods: {
        // 解析hhc文件
        decodeHhcData(doms) {
            let r = [];
            let _recursion = (doms, d) => {
                [].slice.call(doms).forEach(v => {
                    let OBJECT = v.querySelector(`OBJECT`);
                    let p0 = OBJECT.querySelectorAll(`param`)[0];
                    let p1 = OBJECT.querySelectorAll(`param`)[1];
                    let obj = {
                        id: this.$g.UUID(),
                        [p0.getAttribute('name')]: p0.getAttribute('value'),//文件別名
                        [p1.getAttribute('name')]: p1.getAttribute('value'),
                        filePath: `${this.htmPath}${p1.getAttribute('value')}`,//文件路徑
                    }
                    this.current_node || (this.current_node = obj);
                    d.push(obj)
                    if (OBJECT.nextElementSibling) {
                        obj.children = []
                        _recursion(OBJECT.nextElementSibling.children, obj.children)
                    }
                });
            }
            _recursion(doms, r);
            return r;
        },
        // 開(kāi)始上傳
        beforeUpload(d) {
            this.loading = true;
        },
        // 上傳成功
        uploadSuccess(d, f) {
            this.htmPath = d.data.htmPath;
            this.$refs.hhcHTML.innerHTML = d.data.hhcData;
            this.$nextTick(() => {
                let treeData = this.decodeHhcData(this.$refs.hhcHTML.querySelectorAll(`.hhcHTML>ul>li`))
                this.treeData = treeData;
                this.loading = false;
                this.$nextTick(() => {
                    this.$refs.tree.setCurrentKey(this.current_node.id)
                    this.src = this.current_node.filePath;
                });
            });
        },
        // 上傳失敗
        uploadError(d, f) { this.loading = false; },
        //點(diǎn)擊節(jié)點(diǎn)
        nodeClick(data) { },
        //過(guò)濾節(jié)點(diǎn)
        filterNode(value, data) { },
        // 樹(shù)節(jié)點(diǎn)修改
        current_change(d) { this.src = d.filePath; },
    }
};
</script>
<style lang="scss" scoped>
.chmDecode {
    width: 100%;
    display: flex;
    flex-wrap: nowrap;
    $treeWidth: 610px;
    $treeControlWidth: 100px;

    &>.sg-left {

        width: $treeWidth;
        flex-wrap: nowrap;
        white-space: nowrap;
        flex-shrink: 0;

        .tree-header {
            display: flex;
            justify-content: space-between;
            align-items: center;

            &>.sg-left {}

            &>.sg-right {}
        }

        .tree-body {
            height: calc(100vh - 200px);
        }
    }

    &>.sg-right {
        margin-left: 20px;
        flex-grow: 1;
        height: calc(100vh - 170px);


        .baseinfo {
            width: 100%;
            height: 100%;
            overflow-x: hidden;
            overflow-y: auto;
            position: relative;

            .form-body {
                height: calc(100% - 60px);
                overflow-y: auto;
                overflow-x: hidden;
            }

            .form-footer {
                position: absolute;
                height: 70px;
                box-sizing: border-box;
                padding-top: 20px;
                width: 100%;
                display: flex;
                justify-content: space-between;
                bottom: 0;

                &>* {
                    width: 100%;
                    flex-grow: 1;
                }

            }

        }

    }
}
</style>

到了這里,關(guān)于nodejs實(shí)現(xiàn)解析chm文件列表,無(wú)需轉(zhuǎn)換為PDF文件格式,在線(xiàn)預(yù)覽chm文件以及目錄,不依賴(lài)任何網(wǎng)頁(yè)端插件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)文章

  • 無(wú)需付費(fèi)開(kāi)會(huì)員,一個(gè)Python程序?qū)崿F(xiàn)PDF轉(zhuǎn)高清圖片

    今天需要將一個(gè)PDF導(dǎo)出為圖片,但是一般的在線(xiàn)轉(zhuǎn)換網(wǎng)站導(dǎo)出的圖片清晰度都不高,分辨率只有1241*1754,這就導(dǎo)致輸出的圖片放大后字體是有點(diǎn)模糊的,所以就想到了使用Python中的 PyPDF2 庫(kù)來(lái)處理PDF文件,以及 Pillow 庫(kù)來(lái)處理圖像 首先,確保你已安裝所需的庫(kù)。你可以使用以

    2024年02月07日
    瀏覽(22)
  • 簡(jiǎn)單好用的CHM文件閱讀器 CHM Viewer Star最新 for mac

    簡(jiǎn)單好用的CHM文件閱讀器 CHM Viewer Star最新 for mac

    CHM Viewer Star 是一款適用于 Mac 平臺(tái)的 CHM 文件閱讀器軟件,支持本地和遠(yuǎn)程 CHM 文件的打開(kāi)和查看。它提供了直觀易用的界面設(shè)計(jì),支持多種瀏覽模式,如書(shū)籍模式、縮略圖模式和文本模式等,并提供了豐富的功能和工具,如書(shū)簽、搜索、全屏模式等。此外,該軟件還支持多種

    2024年02月07日
    瀏覽(22)
  • 微軟HTML幫助集(CHM文件)

    微軟HTML幫助集(CHM文件)

    微軟HTML幫助集 ,即 已編譯的HTML說(shuō)明檔案 (英語(yǔ):),是微軟繼承早先的WinHelp發(fā)展的一種檔案格式,用來(lái)提供線(xiàn)上幫助,是一種應(yīng)用較廣泛的文件格式。因?yàn)镃HM檔案如一本書(shū)一樣,可以提供內(nèi)容目錄、索引和搜尋等功能,所以也常被用來(lái)制作電子書(shū)。[3]實(shí)際上,微軟閱讀器

    2024年01月19日
    瀏覽(45)
  • 【案例實(shí)戰(zhàn)】NodeJS+Vue3+MySQL實(shí)現(xiàn)列表查詢(xún)功能

    【案例實(shí)戰(zhàn)】NodeJS+Vue3+MySQL實(shí)現(xiàn)列表查詢(xún)功能

    這篇文章,給大家?guī)?lái)一個(gè)列表查詢(xún)的功能,從前端到后端的一個(gè)綜合案例實(shí)戰(zhàn)。 采用vue3作為前端開(kāi)發(fā),nodejs作為后端開(kāi)發(fā)。 首先我們先來(lái)看一下完成的頁(yè)面效果。點(diǎn)擊分頁(yè),可以切換到上一頁(yè)、下一頁(yè)。搜索框可以進(jìn)行模糊查詢(xún)。 后端項(xiàng)目開(kāi)發(fā) 好的,那么看完項(xiàng)目的演

    2024年02月06日
    瀏覽(23)
  • PDF文件轉(zhuǎn)換成word軟件有哪些?分享兩個(gè)文件格式轉(zhuǎn)換軟件

    PDF文件轉(zhuǎn)換成word軟件有哪些?分享兩個(gè)文件格式轉(zhuǎn)換軟件

    在日常辦公中,我們經(jīng)常使用各種辦公軟件,其中PDF和Word是最常見(jiàn)的兩種格式。相較于Word文件,PDF文件具有更強(qiáng)的兼容性和安全性,因此我們通常會(huì)選擇以PDF格式分享文件。然而,如果我們需要提取PDF文件中的部分內(nèi)容,可能會(huì)遇到一些操作上的困難。那么有沒(méi)有簡(jiǎn)單易用

    2024年02月15日
    瀏覽(18)
  • c#,將pdf文件轉(zhuǎn)換成圖片文件

    本文采用Adobe Acrobat9.0的COM組件,將Pdf文件的每一頁(yè)轉(zhuǎn)換成對(duì)應(yīng)的圖片文件。 開(kāi)發(fā)環(huán)境:VS2010,.Net Framework4.0,Adobe Acrobat9.0。 工程中添加COM引用:Adobe Acrobat 9.0 Type Library(必須裝了Adobe Acrobat9.0才會(huì)有)。 思路: 1)CAcroPDDoc:Acrobat文檔對(duì)象。 2)CAcroPDPage:頁(yè)對(duì)象。 3)CAcroR

    2024年02月04日
    瀏覽(24)
  • C# ppt文件轉(zhuǎn)換為pdf文件

    使用第三方插件 Office 實(shí)現(xiàn)轉(zhuǎn)換 1.Application方式轉(zhuǎn)換 2.ApplicationClass方式轉(zhuǎn)換 使用第三方插件 Spire.Presentation 實(shí)現(xiàn)轉(zhuǎn)換 使用第三方插件 Aspose.Slides 實(shí)現(xiàn)轉(zhuǎn)換 ppt轉(zhuǎn)換幫助類(lèi)

    2024年02月07日
    瀏覽(22)
  • 如何將PDF文件轉(zhuǎn)換為PPT文件?

    如何將PDF文件轉(zhuǎn)換為PPT文件?

    ? ? 如何將pdf轉(zhuǎn)換成ppt?PDF文件作為常用的文件格式,不僅可以在教學(xué)過(guò)程中使用,還可以在營(yíng)銷(xiāo)展會(huì)、培訓(xùn)講座等過(guò)程中使用。歐迪芬文件的使用,能夠在一定程度上提升我們的辦公效率。對(duì)于PDF文件來(lái)說(shuō),其中包含的元素非常多,比如文字、圖片以及音視頻等等,這些元

    2024年02月12日
    瀏覽(24)
  • nodeJs 實(shí)現(xiàn)視頻的轉(zhuǎn)換(超詳細(xì)教程)

    nodeJs 實(shí)現(xiàn)視頻的轉(zhuǎn)換(超詳細(xì)教程)

    前段時(shí)間拿到一個(gè)視頻是4k的,沒(méi)法播放,于是通過(guò) node.js??和?ffmpeg 實(shí)現(xiàn)了視頻的轉(zhuǎn)換。在win10 系統(tǒng)下實(shí)現(xiàn)。 所需工具 node 16.19 直接安裝 ffmpeg-5.1.1-essentials_build 解壓后重名 ffmpeg 放到C盤(pán) 然后配置下環(huán)境變量 Git-2.42.0.2-64-bit 直接安裝 安裝完 建一個(gè)demo 的文件夾, demo文件下

    2024年04月28日
    瀏覽(21)
  • mobi文件怎么轉(zhuǎn)換成pdf?

    mobi文件怎么轉(zhuǎn)換成pdf?

    nbsp; mobi文件怎么轉(zhuǎn)換成pdf?在數(shù)字化時(shí)代,電子書(shū)籍成為了越來(lái)越受歡迎的閱讀方式。我們可以通過(guò)多種格式的電子書(shū)來(lái)獲取知識(shí)和娛樂(lè),其中一種常見(jiàn)的格式就是Mobi文件。Mobi文件是亞馬遜公司開(kāi)發(fā)的一種電子書(shū)格式,它主要用于Kindle設(shè)備和Kindle應(yīng)用程序上的閱讀。然而,

    2024年01月18日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包