以上就是给各位分享html2canvas无法在php循环中工作,其中也会对html2canvas无法生成图片进行解释,同时本文还将给你拓展C中的fread()如何在for循环中工作?、html2can
以上就是给各位分享html2canvas 无法在 php 循环中工作,其中也会对html2canvas无法生成图片进行解释,同时本文还将给你拓展C 中的 fread() 如何在 for 循环中工作?、html2canvas、html2canvas + jspdf 实现 html 转 pdf、html2canvas - 微信中长按存图 - 将h5活动结果保存到本地等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- html2canvas 无法在 php 循环中工作(html2canvas无法生成图片)
- C 中的 fread() 如何在 for 循环中工作?
- html2canvas
- html2canvas + jspdf 实现 html 转 pdf
- html2canvas - 微信中长按存图 - 将h5活动结果保存到本地
html2canvas 无法在 php 循环中工作(html2canvas无法生成图片)
如何解决html2canvas 无法在 php 循环中工作
我有一个 javascript 函数 print()
。它由 PHP 循环调用。它在页面上显示图像的 2 个副本。
如果我运行它 1 次,没有任何问题并且下面的函数可以工作。但是如果我运行它超过 1 次,由于 hmtl2canvas 的承诺性质,它会损坏。
我搜索了使 html2canvas 工作同步但没有太多解决方案
我也尝试将它放在 async/await 中,但它们都不起作用。
function print(html_string){
let leftPanel = ''left''+Date.Now(); //create Unique ID
let rightPanel = ''right''+Date.Now(); //create Unique ID
document.body.innerHTML += "<divdisplay:flex;''><div id=''"+leftPanel+"''></div><div id=''"+rightPanel+"''></div></div>";
var iframe=document.createElement(''iframe'');
document.body.appendChild(iframe);
var iframedoc=iframe.contentDocument||iframe.contentwindow.document;
iframedoc.body.innerHTML=html_string;
html2canvas(iframedoc.body).then(canvas => {
jQuery("#"+leftPanel).append(canvas);
});
html2canvas(iframedoc.body).then(canvas => {
jQuery("#"+rightPanel).append(canvas);
document.body.removeChild(iframe);
});
}
编辑:
上面的javascript函数被下面的PHP循环调用:
foreach($InvoiceNos as $row){
$downloadedInvoiceHtml = requestInvoice($row->UUID);
?><script>print(''<?=$downloadedInvoiceHtml?>'');</script><?PHP
}
解决方法
使用数组
<script>
const html = [];
<?php
foreach($InvoiceNos as $row){
$downloadedInvoiceHtml = requestInvoice($row->UUID);
?>html.push(''<?=$downloadedInvoiceHtml?>'');<?php
} ?>
let cnt = 0;
function print(){
if (cnt >= html.length) return; // stop
$("body").append(`<div style=''display:flex;''><div></div><div></div></div>`);
const div = document.createElement("div");
div.innerHTML = html[cnt]
html2canvas(div).then(canvas => {
$("body div:last-child div").append(canvas);
cnt++;
print()
});
}
print()
</script>
替代
,
<?php
foreach($InvoiceNos as $row){
$downloadedInvoiceHtml = requestInvoice($row->UUID);
?><div style="display:flex"><div class="html"><?=$downloadedInvoiceHtml?></div></div>
} ?>
<script>
let cnt = 0;
const $html = $(".html");
function print(){
if (cnt >= $html.length) return; // stop
$current = $html[cnt]
html2canvas($html).then(canvas => {
$current.empty().append(canvas);
$current.after($current.clone(true);
cnt++;
print()
});
}
print()
</script>
无需在每个循环中执行 print()
,只需将内容存储在变量中并在完成后打印结果。
C 中的 fread() 如何在 for 循环中工作?
如何解决C 中的 fread() 如何在 for 循环中工作?
我是 C 编程的新手,但我需要它来读取我在下面描述的一些二进制文件。
印度气象部门 (IMD) 在其 website 中提供了 .Grd 文件中的历史天气数据。他们还提供了示例 C 代码来读取这些文件。从他们的示例 C 代码中,我编写了以下代码,用于提取 1980 年 4 月 15 日记录在印度 31x31 网格上的每日最低温度。
/* This program reads binary data for 365/366 days and writes in ascii file. */
#include <stdio.h>
int main() {
float t[31][31];
int i,j,k;
FILE *fin,*fout;
fin = fopen("C:\\\\New folder\\\\Mintemp_MinT_1980.Grd","rb"); // Input file
fout = fopen("C:\\\\New folder\\\\MINT15APR1980.TXT","w"); // Output file
fprintf(fout,"Daily Minimum Tempereture for 15 April 1980\\n");
if(fin == NULL) {
printf("Can''t open file");
return 0;
}
if(fout == NULL) {
printf("Can''t open file");
return 0;
}
for(k=0 ; k<366 ; k++) {
fread(&t,sizeof(t),1,fin);
if(k == 105) {
for(i=0 ; i < 31 ; i++) {
fprintf(fout,"\\n") ;
for(j=0 ; j < 31 ; j++)
fprintf(fout,"%6.2f",t[i][j]);
}
}
}
fclose(fin);
fclose(fout);
return 0;
}
/* end of main */
文件 Mintemp_MinT_1980.Grd
可以从 IMD website 下载,选择年份为 1980 与最低温度。
我不明白的是,fread() 函数在循环 fread(&t,fin)
内的行 for(k=0 ; k<366 ; k++)
中实际上是如何工作的。显而易见,这里 fread() 的参数不依赖于循环变量 k
,因此它应该为每个 t[31][31]
将相同的数据读取到矩阵 k
。但是,我查了一下,出人意料的是,对于k
行中不同的if(k == 105)
值,该程序提取的数据是不同的,即为k == 105
和{{1}提取的数据}} 是不同的,例如。
如果有人能解释以上内容,我将不胜感激。
解决方法
文件包含顺序数据。所有文件操作符都基于这样一个前提:无论您对文件做什么,您通常都会按顺序进行。
因此,当您读取数据,然后读取更多数据时,您将获得文件的连续块。 FILE 数据类型和操作系统本身都会为您做很多事情,包括跟踪您在文件中的当前位置以及在内存中进行块缓冲以提高性能。
如果您想重新读取相同的数据,或在文件中跳过,您需要在下一次读取之前使用 fseek() 更改文件中的位置。
html2canvas
html2canvas
该脚本允许您直接在用户浏览器上拍摄网页或其部分的“截图”。截图是基于DOM,因此可能不是100%准确的真实表示,因为它不会实际的截图,而是根据页面上可用的信息构建截图。
html2canvas + jspdf 实现 html 转 pdf
在前端开发中, html 转 pdf 是最常见的需求,实现这块需求的开发 html2canvas 和 jspdf 是最常用的两个插件,插件都是现成的,但是有时候用不好,也不出现很多头疼问题:
1. 生成的 pdf 清晰度不高,比较模糊;
2.多页 pdf 会出现把内容给分割的情况,特别是文字被分割时,体验很不友好;
3.页面较宽或较长时,或出现生成的 pdf 内容不全的情况。
如果你在项目中出现以上情况,那么不着急,往下看就对了,下面的代码统统为你解决了
话不多说,直接上代码:
/*
* @Description: html 转为 pdf 并下载
* @Author: cmyoung
* @Date: 2018-08-10 19:07:32
* @LastEditTime: 2019-08-23 16:34:18
*/
/**
* @param html { String } DOM树
* @param isOne { Boolean } 是否为单页 默认 否(false)
* @return 文件 {pdf格式}
*/
''use strict''
import * as jsPDF from ''jspdf''
import html2canvas from ''html2canvas''
export default async (html, isOne) => {
let contentWidth = html.clientWidth // 获得该容器的宽
let contentHeight = html.clientHeight // 获得该容器的高
let canvas = document.createElement(''canvas'')
let scale = 2 // 解决清晰度问题,先放大 2倍
canvas.width = contentWidth * scale // 将画布宽&&高放大两倍
canvas.height = contentHeight * scale
canvas.getContext(''2d'').scale(scale, scale)
let opts = {
scale: scale,
canvas: canvas,
width: contentWidth,
height: contentHeight,
useCORS: true
}
return html2canvas(html, opts).then(canvas => {
let pageData = canvas.toDataURL(''image/jpeg'', 1.0) // 清晰度 0 - 1
let pdf
if (isOne) {
// 单页
console.log(contentWidth, ''contentWidth'')
console.log(contentHeight, ''contentHeight'')
// jspdf.js 插件对单页面的最大宽高限制 为 14400
let limit = 14400
if (contentHeight > limit) {
let contentScale = limit / contentHeight
contentHeight = limit
contentWidth = contentScale * contentWidth
}
let orientation = ''p''
// 在 jspdf 源码里,如果是 orientation = ''p'' 且 width > height 时, 会把 width 和 height 值交换,
// 类似于 把 orientation 的值修改为 ''l'' , 反之亦同。
if (contentWidth > contentHeight) {
orientation = ''l''
}
// orientation Possible values are "portrait" or "landscape" (or shortcuts "p" or "l")
pdf = new jsPDF(orientation, ''pt'', [contentWidth, contentHeight]) // 下载尺寸 a4 纸 比例
// pdf.addImage(pageData, ''JPEG'', 左,上,宽度,高度)设置
pdf.addImage(pageData, ''JPEG'', 0, 0, contentWidth, contentHeight)
} else {
//一页 pdf 显示 html 页面生成的 canvas高度
let pageHeight = (contentWidth / 552.28) * 841.89
//未生成 pdf 的 html页面高度
let leftHeight = contentHeight
//页面偏移
let position = 0
//a4纸的尺寸[595.28,841.89],html 页面生成的 canvas 在pdf中图片的宽高
let imgWidth = 555.28
let imgHeight = (imgWidth / contentWidth) * contentHeight
pdf = new jsPDF('''', ''pt'', ''a4'') // 下载尺寸 a4 纸 比例
//有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
//当内容未超过pdf一页显示的范围,无需分页
if (leftHeight < pageHeight) {
pdf.addImage(pageData, ''JPEG'', 20, 0, imgWidth, imgHeight)
} else {
while (leftHeight > 0) {
pdf.addImage(pageData, ''JPEG'', 20, position, imgWidth, imgHeight)
leftHeight -= pageHeight
position -= 841.89
//避免添加空白页
if (leftHeight > 0) {
pdf.addPage()
}
}
}
}
return pdf
})
}
以上方法支持,生成的 pdf 为 单页或多页可选,如果不是需求必须是多页的,建议都选择生成 单页的,为什么呢?
因为单页不会出现内容或文字分割的情况。
但是,如果内容过长超过 14400 的话,那么你会发现 14400 之外的内容获取不到了,这是为什么呢?看来 jspdf 的源码之后找到答案,源码里面有限制:
不过,我的代码里已经解决过长的问题(宽度一般不会超过,特殊场景暂不考虑),超过 14400 时,按照高度就为 14400 来算缩放比例,宽度按比例缩放好像就行了,这就完事了?
不不不,好像还有坑,就是 orientation ,有两个值 "portrait" or "landscape",默认是 ''p'', 当 orientation = ''p'' 且 width > height 时, 他默认会把 width 和 height 值交换,如果你不想要他交换,那么当你的 width > height 时,你把 orientation 动态改为 ''l'' 即可,反之亦然。
以上希望对你有用,谢谢!
html2canvas - 微信中长按存图 - 将h5活动结果保存到本地
现在有很多在微信里流行的h5活动页。这些小h5大部分都是简单的交互然后得出一个abcd早就拟定好的结果,根据你的选项分几种情况,最终得到其中一个作为你测试的答案。比如这个就是最后那张结果图:
当时自己做的时候,网上搜不到一个系统完整的做法讲解。这里整理一下。
### 实现微信h5保存网页为图片
1. html2canvas生成截图
html2img({
targetEleId: oCanvas,
imgType: ''png'',
titleStr: ''描述语''
},false)
.then((imgUrl)=>{
let oImg = document.createElement(''img'');
oImg.id = ''oImg'';
oImg.className = ''o-img'';
oImg.src= imgUrl;//imgUrl是html2canvas返回的截图的base64码
document.body.appendChild(oImg);//将生成的截图放到页面中
});
2. 长按截图(核心)- 调取微信的保存图片到手机功能。
.o-img{
position: absolute;
top: 0;
left: 0;
width: 100%;
opacity: 0;
z-index: 20;
}
关于html2canvas 无法在 php 循环中工作和html2canvas无法生成图片的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于C 中的 fread() 如何在 for 循环中工作?、html2canvas、html2canvas + jspdf 实现 html 转 pdf、html2canvas - 微信中长按存图 - 将h5活动结果保存到本地等相关内容,可以在本站寻找。
本文标签: