`){
InsertUeditor(`
`);
}else{
InsertUeditor(mystorage.get('cookie_content'));
}
});
// 添加文件上传功能
function is_upload_word(type) {
// 创建隐藏的文件输入框
var fileInput = $('');
// 根据不同类型设置接受的文件格式
switch(type) {
case 1: // WORD文档
fileInput.attr('accept', '.doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document');
break;
case 2: // EXCEL文档
fileInput.attr('accept', '.xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
break;
case 3: // PDF文档
fileInput.attr('accept', '.pdf,application/pdf');
break;
case 4: // MP3音频
fileInput.attr('accept', '.mp3,audio/mpeg');
break;
}
// 监听文件选择事件
fileInput.on('change', function(e) {
if (this.files && this.files[0]) {
// 这里可以添加实际的上传逻辑
//console.log('选择了文件:', this.files[0]);
//alert('选择了文件: ' + this.files[0].name + '\n现在应该执行上传操作');
// 实际使用中,这里应该调用上传API
// uploadFile(this.files[0], type);
const file = this.files[0];
if (file && file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
const reader = new FileReader();
reader.onload = function(e) {
const arrayBuffer = e.target.result;
mammoth.convertToHtml({arrayBuffer: arrayBuffer})
.then(function(result){
const cleanText = result.value;
InsertUeditor(cleanText);
})
.catch(function(err){
layer.alert("读取Word文档失败:"+err,{title:'提示',icon:2,shade:.5});
});
};
reader.readAsArrayBuffer(file);
} else if (file && file.name.endsWith('.doc')) { // 添加对 .doc 文件的支持
const reader = new FileReader();
reader.onload = function(e) {
const arrayBuffer = e.target.result;
mammoth.convertToHtml({arrayBuffer: arrayBuffer})
.then(function(result){
const cleanText = result.value;
InsertUeditor(cleanText);
})
.catch(function(err){
layer.alert("请将文件格式转为docx后再来上传",{title:'提示',icon:2,shade:.5});
});
};
reader.readAsArrayBuffer(file);
}else if (file && (file.name.endsWith('.xlsx') || file.name.endsWith('.xls'))) {
const reader = new FileReader();
reader.onload = function(e) {
const arrayBuffer = e.target.result;
try {
// ✅ 这一行是关键:SheetJS 自动识别 .xls 和 .xlsx
const workbook = XLSX.read(arrayBuffer, { type: 'array' });
if (!workbook.SheetNames || workbook.SheetNames.length === 0) {
layer.alert("文件中没有工作表", { title: '提示', icon: 2 });
return;
}
const firstSheet = workbook.Sheets[workbook.SheetNames[0]];
const data = XLSX.utils.sheet_to_json(firstSheet, { header: 1, defval: '' });
console.log("解析出的数据:", data); // ✅ 看看 .xls 文件是否有数据
if (!data || data.length === 0) {
layer.alert("文件为空或无法解析数据", { title: '提示', icon: 2 });
return;
}
let html = '';
data.forEach((row, i) => {
html += '';
row.forEach(cell => {
const text = cell == null ? '' : String(cell);
html += `| ${text} | `;
});
html += '
';
});
html += '
';
InsertUeditor(html);
} catch (err) {
console.error("解析 Excel 失败:", err);
layer.alert("解析失败:" + err.message, { title: '错误', icon: 2 });
}
};
reader.readAsArrayBuffer(file);
}else if (file && file.type === 'application/pdf') {
pdfjsLib.GlobalWorkerOptions.workerSrc = '/static/pdf/pdf.worker.min.js';
const reader = new FileReader();
reader.onload = function(e) {
const arrayBuffer = e.target.result;
// 使用 pdf.js 加载 PDF 文档
// 指定 CMap 路径以支持中文等复杂字符集
pdfjsLib.getDocument({
data: new Uint8Array(arrayBuffer),
cMapUrl: '/static/pdf/bcmaps/', // 确保该路径下有正确的 CMap 文件
cMapPacked: true // CMap 文件是压缩格式
}).promise.then(function(pdf) {
let allText = ''; // 存储所有页面的文本内容
// 遍历每一页,提取文本
const promises = [];
for (let pageNumber = 1; pageNumber <= pdf.numPages; pageNumber++) {
promises.push(
pdf.getPage(pageNumber).then(function(page) {
return page.getTextContent().then(function(textContent) {
// 提取每页的文字
return textContent.items.map(item => item.str).join(' ');
});
})
);
}
// 等待所有页面文本提取完成
Promise.all(promises)
.then(function(pagesText) {
allText = pagesText.join(' '); // 合并所有页面文本
InsertUeditor(allText);
})
.catch(function(err) {
layer.alert("读取PDF文档失败: " + err.message, {
title: '提示',
icon: 2,
shade: 0.5
});
});
}).catch(function(err) {
layer.alert("加载PDF文档失败: " + err.message, {
title: '提示',
icon: 2,
shade: 0.5
});
});
};
// 开始读取文件(确保 file 已定义)
reader.readAsArrayBuffer(file);
} else if (file && file.type === 'audio/mpeg') {
alert(111);
}
}
// 在处理完文件选择后移除输入框
$(this).remove();
});
// 触发文件选择
$('body').append(fileInput);
fileInput.click();
}
//生成图片、PDF和视频功能
function is_download(type) {
if (!$.cookie('login_status') || $.cookie('login_status') == 0) {
layer.msg('请登录后再操作', {
icon: 2,
shade: 0.8,
time: 2000
});
window.setTimeout(function () {
window.location.href = '/index/index/jump_login.html';
}, 2500);
return false;
}
var iframe = document.getElementById('ueditor_0');
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
// 先滚动 body
iframeDocument.body.scrollTop = 0;
iframeDocument.documentElement.scrollTop = 0;
var $body = $("#ueditor_0").contents().find('body');
$body.css({
'background-color': '#fff',
'width': 'auto', // 根据需要调整宽度
'height': 'auto' // 根据需要调整高度
});
var _canvas = $("#ueditor_0").contents().find('body');
//生成图片
if(type == 1){
var opts = {
logging: false,
useCORS: true,
backgroundColor: '#FFFFFF'
};
// 1. 找到所有视频元素并临时隐藏
var videos = _canvas.querySelectorAll('video');
var hiddenVideos = [];
videos.forEach(function(video) {
hiddenVideos.push({
element: video,
display: video.style.display
});
video.style.display = 'none'; // 隐藏视频
});
// 2. 截图
html2canvas(_canvas, opts).then(function(canvas) {
var htmltoimgurl = canvas.toDataURL("image/jpg")
.replace("image/jpg", "image/octet-stream");
fileDownload(htmltoimgurl);
// 3. 截图完成后恢复视频显示
restoreVideos();
});
// 恢复视频显示
function restoreVideos() {
hiddenVideos.forEach(function(item) {
item.element.style.display = item.display; // 恢复原始 display 值
});
}
// 防止意外失败时也能恢复(可选)
window.addEventListener('beforeunload', restoreVideos);
}
//生成pdf
if (type == 2) {
try {
var content = UE.getEditor('editor').getContent();
var loadindex = layer.load(0, {shade: 0.5,time:0});
$.ajax({
type: 'post',
url:'/api/pdf/down.html',
data: {content:content},
dataType: 'json',
success: function(response){
layer.close(loadindex);
if (response.code == 0) {
const link = document.createElement('a');
link.href = response.url;
link.download = ''; // 使用服务器文件名
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
} else {
layer.msg(response.msg, { shade: 0.5, time: 1500 });
}
},
error:function() {
layer.close(loadindex);
layer.msg('操作失败',{shade: 0.5,icon:5,time:1500});
}
});
} catch (err) {
console.error("❌ 初始化失败:", err);
alert("初始化失败:" + err.message);
}
}
//生成视频
if(type == 3){
var opts = {
logging: false, //日志开关,便于查看html2canvas的内部执行流程
useCORS: true, // 【重要】开启跨域配置
backgroundColor: '#FFFFFF' // 设置背景颜色为白色
};
var htmltoimgurl;
html2canvas(_canvas,opts).then(function (canvas) {
// ✅ 关键:使用 toBlob 而不是 toDataURL
canvas.toBlob(function(blob) {
// 创建 FormData
var formData = new FormData();
formData.append('image', blob, 'screenshot.jpg'); // 文件名可自定义
var loadindex = layer.load(0, {shade: 0.5,time:0});
// 发送请求
$.ajax({
url: '/api/video/down.html',
type: 'POST',
data: formData,
processData: false, // ✅ 必须:不处理数据
contentType: false, // ✅ 必须:让浏览器自动设置 content-type
dataType: 'json',
success: function(res) {
layer.close(loadindex);
if (res.success) {
const link = document.createElement('a');
link.href = res.video;
link.download = ''; // 使用服务器文件名
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
} else {
alert('上传失败: ' + res.msg);
}
},
error: function(xhr, status, err) {
alert('上传失败: ' + err);
console.error(xhr.responseText);
}
});
}, 'image/jpeg', 0.95); // jpeg 格式,95% 质量
});
// var $body = $("#ueditor_0").contents().find('body');
// $body.css({
// 'background-color': '#fff',
// 'overflow': 'hidden',
// 'width': 'auto',
// 'height': 'auto'
// });
//
// var _canvas = $body[0]; // 注意:传入 DOM 元素,不是 jQuery 对象
// var opts = {
// logging: false,
// useCORS: true,
// backgroundColor: '#FFFFFF',
// scale: 2
// };
//
// html2canvas(_canvas, opts).then(function (canvas) {
// // ✅ 关键:使用 toBlob 而不是 toDataURL
// canvas.toBlob(function(blob) {
// // 创建 FormData
// var formData = new FormData();
// formData.append('image', blob, 'screenshot.jpg'); // 文件名可自定义
// var loadindex = layer.load(0, {shade: 0.5,time:0});
// // 发送请求
// $.ajax({
// url: '/api/video/down.html',
// type: 'POST',
// data: formData,
// processData: false, // ✅ 必须:不处理数据
// contentType: false, // ✅ 必须:让浏览器自动设置 content-type
// dataType: 'json',
// success: function(res) {
// layer.close(loadindex);
// if (res.success) {
// const link = document.createElement('a');
// link.href = res.video;
// link.download = ''; // 使用服务器文件名
//
// document.body.appendChild(link);
// link.click();
// document.body.removeChild(link);
// } else {
// alert('上传失败: ' + res.msg);
// }
// },
// error: function(xhr, status, err) {
// alert('上传失败: ' + err);
// console.error(xhr.responseText);
// }
// });
// }, 'image/jpeg', 0.95); // jpeg 格式,95% 质量
// });
}
}