|
|
@@ -1904,12 +1904,11 @@ const handleHomeworkSubmit = async () => {
|
|
|
message.error(lang.ssFailedGetIframeBody)
|
|
|
throw new Error('未能获取到iframe的body元素,无法截图')
|
|
|
}
|
|
|
+
|
|
|
try {
|
|
|
const a = iframeBody.getElementsByTagName('img')
|
|
|
const b = iframeBody.getElementsByTagName('video')
|
|
|
- const webglCanvases = iframeBody.getElementsByTagName('canvas')
|
|
|
-
|
|
|
-
|
|
|
+ //const c = iframeBody.getElementsByTagName('canvas')
|
|
|
iframeBody.style.cssText += 'width:100%;height:100%;position:absolute;top:0;left:0;'
|
|
|
iframehtml.style.cssText += 'width:100%;height:100%;position:absolute;top:0;left:0;'
|
|
|
for (let i = 0;i < a.length;i++) {
|
|
|
@@ -1919,83 +1918,22 @@ const handleHomeworkSubmit = async () => {
|
|
|
b[i].crossOrigin = 'anonymous'
|
|
|
}
|
|
|
|
|
|
- try {
|
|
|
- // 1. 转换所有 WebGL 画布为临时图片
|
|
|
- const promises = [];
|
|
|
- for (let i = 0; i < webglCanvases.length; i++) {
|
|
|
- const originalCanvas = webglCanvases[i];
|
|
|
- const promise = new Promise((resolve, reject) => {
|
|
|
- originalCanvas.toBlob(blob => {
|
|
|
- if (!blob) {
|
|
|
- reject(new Error('toBlob failed for canvas'));
|
|
|
- return;
|
|
|
- }
|
|
|
- const img = new Image();
|
|
|
- const url = URL.createObjectURL(blob);
|
|
|
-
|
|
|
- img.onload = () => {
|
|
|
- const rect = originalCanvas.getBoundingClientRect();
|
|
|
- img.style.position = 'absolute';
|
|
|
- img.style.left = rect.left + 'px';
|
|
|
- img.style.top = rect.top + 'px';
|
|
|
- img.style.width = originalCanvas.clientWidth + 'px';
|
|
|
- img.style.height = originalCanvas.clientHeight + 'px';
|
|
|
- img.style.zIndex = '9999';
|
|
|
- img.classList.add('temp-canvas-replacement');
|
|
|
-
|
|
|
- originalCanvas.parentNode.insertBefore(img, originalCanvas);
|
|
|
- originalCanvas.style.opacity = '0';
|
|
|
-
|
|
|
- resolve({
|
|
|
- originalCanvas,
|
|
|
- tempImage: img,
|
|
|
- blobUrl: url
|
|
|
- });
|
|
|
- };
|
|
|
- img.onerror = () => reject(new Error('Image load failed'));
|
|
|
- img.src = url;
|
|
|
- });
|
|
|
- });
|
|
|
- promises.push(promise);
|
|
|
- }
|
|
|
-
|
|
|
- const replacements = await Promise.all(promises);
|
|
|
-
|
|
|
- const html2canvas = await import('html2canvas')
|
|
|
- // 2. 执行截图
|
|
|
- const canvas = await html2canvas.default(iframeBody, {
|
|
|
- scale: 2,
|
|
|
- allowTaint: false,
|
|
|
- useCORS: true,
|
|
|
- logging: true,
|
|
|
- });
|
|
|
-
|
|
|
- imageData = canvas.toDataURL('image/png', 0.95);
|
|
|
- console.log('截图成功', imageData);
|
|
|
-
|
|
|
- // 3. 清理临时图片并恢复原画布
|
|
|
- replacements.forEach(({ originalCanvas, tempImage, blobUrl }) => {
|
|
|
- URL.revokeObjectURL(blobUrl);
|
|
|
- tempImage.remove();
|
|
|
- originalCanvas.style.opacity = '1';
|
|
|
- });
|
|
|
-
|
|
|
- // 可选:将截图 canvas 添加到页面
|
|
|
- document.body.appendChild(canvas);
|
|
|
-
|
|
|
- // 返回或使用 imageData
|
|
|
- // return imageData;
|
|
|
-
|
|
|
- } catch (error) {
|
|
|
- console.error('处理过程中出错:', error);
|
|
|
- // 如果有部分替换成功,需要清理(这里简化处理,实际可以捕获已成功的替换)
|
|
|
- // 可尝试清除所有带有 'temp-canvas-replacement' 类的图片
|
|
|
- document.querySelectorAll('.temp-canvas-replacement').forEach(img => img.remove());
|
|
|
- // 恢复所有被隐藏的画布
|
|
|
- for (let i = 0; i < webglCanvases.length; i++) {
|
|
|
- webglCanvases[i].style.opacity = '1';
|
|
|
- }
|
|
|
- }
|
|
|
+ // 直接对iframe内部的body进行截图
|
|
|
+ const html2canvas = await import('html2canvas')
|
|
|
+ const canvas = await html2canvas.default(iframeBody, {
|
|
|
+ // useCORS: true,
|
|
|
+ // allowTaint: true,
|
|
|
+ // scale: 1,
|
|
|
+ // backgroundColor: '#ffffff',
|
|
|
+ // logging: false,
|
|
|
+ // foreignObjectRendering: true,
|
|
|
+ // removeContainer: true
|
|
|
+ scale: 2, // 提高清晰度
|
|
|
+ allowTaint: false, // 是否允许跨域污染画布
|
|
|
+ useCORS: true, // 尝试跨域加载图片
|
|
|
+ logging: true,
|
|
|
+ })
|
|
|
+ imageData = canvas.toDataURL('image/png', 0.95)
|
|
|
|
|
|
console.log('成功截图iframe内部内容')
|
|
|
}
|