GVKun编程网logo

html2canvas 无法在 php 循环中工作(html2canvas无法生成图片)

1

以上就是给各位分享html2canvas无法在php循环中工作,其中也会对html2canvas无法生成图片进行解释,同时本文还将给你拓展C中的fread()如何在for循环中工作?、html2can

以上就是给各位分享html2canvas 无法在 php 循环中工作,其中也会对html2canvas无法生成图片进行解释,同时本文还将给你拓展C 中的 fread() 如何在 for 循环中工作?、html2canvas、html2canvas + jspdf 实现 html 转 pdf、html2canvas - 微信中长按存图 - 将h5活动结果保存到本地等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

html2canvas 无法在 php 循环中工作(html2canvas无法生成图片)

html2canvas 无法在 php 循环中工作(html2canvas无法生成图片)

如何解决html2canvas 无法在 php 循环中工作

我有一个 javascript 函数 print()。它由 PHP 循环调用。它在页面上显示图像的 2 个副本。

如果我运行它 1 次,没有任何问题并且下面的函数可以工作。但是如果我运行它超过 1 次,由于 hmtl2canvas 的承诺性质,它会损坏。

我搜索了使 html2canvas 工作同步但没有太多解决方案

我也尝试将它放在 async/await 中,但它们都不起作用。

  1. function print(html_string){
  2. let leftPanel = ''left''+Date.Now(); //create Unique ID
  3. let rightPanel = ''right''+Date.Now(); //create Unique ID
  4. document.body.innerHTML += "<divdisplay:flex;''><div id=''"+leftPanel+"''></div><div id=''"+rightPanel+"''></div></div>";
  5. var iframe=document.createElement(''iframe'');
  6. document.body.appendChild(iframe);
  7. var iframedoc=iframe.contentDocument||iframe.contentwindow.document;
  8. iframedoc.body.innerHTML=html_string;
  9. html2canvas(iframedoc.body).then(canvas => {
  10. jQuery("#"+leftPanel).append(canvas);
  11. });
  12. html2canvas(iframedoc.body).then(canvas => {
  13. jQuery("#"+rightPanel).append(canvas);
  14. document.body.removeChild(iframe);
  15. });
  16. }

编辑:

上面的javascript函数被下面的PHP循环调用:

  1. foreach($InvoiceNos as $row){
  2. $downloadedInvoiceHtml = requestInvoice($row->UUID);
  3. ?><script>print(''<?=$downloadedInvoiceHtml?>'');</script><?PHP
  4. }

解决方法

使用数组

  1. <script>
  2. const html = [];
  3. <?php
  4. foreach($InvoiceNos as $row){
  5. $downloadedInvoiceHtml = requestInvoice($row->UUID);
  6. ?>html.push(''<?=$downloadedInvoiceHtml?>'');<?php
  7. } ?>
  8. let cnt = 0;
  9. function print(){
  10. if (cnt >= html.length) return; // stop
  11. $("body").append(`<div style=''display:flex;''><div></div><div></div></div>`);
  12. const div = document.createElement("div");
  13. div.innerHTML = html[cnt]
  14. html2canvas(div).then(canvas => {
  15. $("body div:last-child div").append(canvas);
  16. cnt++;
  17. print()
  18. });
  19. }
  20. print()
  21. </script>

替代

  1. <?php
  2. foreach($InvoiceNos as $row){
  3. $downloadedInvoiceHtml = requestInvoice($row->UUID);
  4. ?><div style="display:flex"><div class="html"><?=$downloadedInvoiceHtml?></div></div>
  5. } ?>
  6. <script>
  7. let cnt = 0;
  8. const $html = $(".html");
  9. function print(){
  10. if (cnt >= $html.length) return; // stop
  11. $current = $html[cnt]
  12. html2canvas($html).then(canvas => {
  13. $current.empty().append(canvas);
  14. $current.after($current.clone(true);
  15. cnt++;
  16. print()
  17. });
  18. }
  19. print()
  20. </script>
,

无需在每个循环中执行 print(),只需将内容存储在变量中并在完成后打印结果。

C 中的 fread() 如何在 for 循环中工作?

C 中的 fread() 如何在 for 循环中工作?

如何解决C 中的 fread() 如何在 for 循环中工作?

我是 C 编程的新手,但我需要它来读取我在下面描述的一些二进制文件。

印度气象部门 (IMD) 在其 website 中提供了 .Grd 文件中的历史天气数据。他们还提供了示例 C 代码来读取这些文件。从他们的示例 C 代码中,我编写了以下代码,用于提取 1980 年 4 月 15 日记录在印度 31x31 网格上的每日最低温度。

  1. /* This program reads binary data for 365/366 days and writes in ascii file. */
  2. #include <stdio.h>
  3. int main() {
  4. float t[31][31];
  5. int i,j,k;
  6. FILE *fin,*fout;
  7. fin = fopen("C:\\\\New folder\\\\Mintemp_MinT_1980.Grd","rb"); // Input file
  8. fout = fopen("C:\\\\New folder\\\\MINT15APR1980.TXT","w"); // Output file
  9. fprintf(fout,"Daily Minimum Tempereture for 15 April 1980\\n");
  10. if(fin == NULL) {
  11. printf("Can''t open file");
  12. return 0;
  13. }
  14. if(fout == NULL) {
  15. printf("Can''t open file");
  16. return 0;
  17. }
  18. for(k=0 ; k<366 ; k++) {
  19. fread(&t,sizeof(t),1,fin);
  20. if(k == 105) {
  21. for(i=0 ; i < 31 ; i++) {
  22. fprintf(fout,"\\n") ;
  23. for(j=0 ; j < 31 ; j++)
  24. fprintf(fout,"%6.2f",t[i][j]);
  25. }
  26. }
  27. }
  28. fclose(fin);
  29. fclose(fout);
  30. return 0;
  31. }
  32. /* 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

html2canvas

该脚本允许您直接在用户浏览器上拍摄网页或其部分的“截图”。截图是基于DOM,因此可能不是100%准确的真实表示,因为它不会实际的截图,而是根据页面上可用的信息构建截图。

html2canvas + jspdf 实现 html 转 pdf

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活动结果保存到本地

html2canvas - 微信中长按存图 - 将h5活动结果保存到本地

 现在有很多在微信里流行的h5活动页。这些小h5大部分都是简单的交互然后得出一个abcd早就拟定好的结果,根据你的选项分几种情况,最终得到其中一个作为你测试的答案。比如这个就是最后那张结果图:

 

当时自己做的时候,网上搜不到一个系统完整的做法讲解。这里整理一下。

### 实现微信h5保存网页为图片

虽然基本上活动都是有事先固定好的答案,但是每个用户生成的结果还是不一样的。尤其有的需求还有用户的昵称之类。
所以,就要动态生成web网页为图片了,然后用户长按这张图片,调取微信的长按存图功能就行了。

 

这里只记录 最后生成截图并保存的做法
一般做法是,用户选择完毕生成结果后,要有一个事件比如click提前触发,让html2canvas赶紧画图:
具体html2canvas的使用和配置,以及bug填坑之类请看这一篇:[ JS - 基于html2canvas实现 网页截图(+下载截图) 功能](https://www.cnblogs.com/padding1015/p/8947062.html)
这里我直接调用基于html2canvas封装好的html2img方法:

1. html2canvas生成截图

```js
html2img({
  targetEleId: oCanvas,
  imgType: ''png'',
  titleStr: ''描述语''
},false)
```
然后获取截图的base64码,作为图片的src,将新创造的img元素放进body中,
```js
.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. 长按截图(核心)- 调取微信的保存图片到手机功能。

普通需求下,
既然微信是按谁存谁,按哪张图存哪张图,那把需要存的图盖到最上边,让其成为用户可以按到的唯一一张图,不就可以了?
所以 将这张要保存的图片的层级调到最高,盖到所有元素的上边,就可以实现用户长按图片弹出保存功能




但有时候会遇到 某些需求 - 事实上市面上很多h5也实现了这个效果:)
要求最后保存到手机的图和用户当前看的最后一张结果图不是一个!!!

 

一开始我都想哭。

 

我怎么长按这个图存另一张啊,微信的长按存图又没接口给我改图片的url。

 

后来想,让盖在上边的图不可视不就好了? 一张看不见的图盖在结果上边,虽然用户看到的是结果图,但是存下来的就是另一张当时隐身的截图。
狸猫换太子!

 

问题又来了:微信能否长按一张看不见、但是存在于dom结构中的图,也调起存图功能呢?
经过提心吊胆地测试后得出结论: 长按不可视的图片也可以调起微信的长按存图功能。哈哈!

 

所以最后的处理是:最后要保存的图盖在最上边, 要让其看不见,就设置透明度 opacity即可。
```css
.o-img{
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  opacity: 0;
  z-index: 20;
}
```
 
 2018-08-14  16:32:00

关于html2canvas 无法在 php 循环中工作html2canvas无法生成图片的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于C 中的 fread() 如何在 for 循环中工作?、html2canvas、html2canvas + jspdf 实现 html 转 pdf、html2canvas - 微信中长按存图 - 将h5活动结果保存到本地等相关内容,可以在本站寻找。

本文标签: