Html2canvas: Gibt ein leeres Bild für jedes Element zurück, wenn der Dokumenttext mehr als 30.000 Pixel groß ist.

Erstellt am 31. Mai 2016  ·  16Kommentare  ·  Quelle: niklasvh/html2canvas

Die Bibliothek gibt ein leeres Bild zurück, wenn der Textkörper des Dokuments mehr als 30.000 Pixel beträgt. Sie würden versuchen, ein Element von 100 x 100 zu erfassen. Sie erhalten jedoch ein leeres Bild des Elements auf einem großen Körper.

Hier ist eine Geige, die diesen Fehler demonstriert.

https://jsfiddle.net/fvo1xh8b/2/

Sie können die Körpergröße auf weniger als 30.000 ändern und es funktioniert gut.

Needs More Information

Hilfreichster Kommentar

@niklasvh Dies ist eine schwierige

  • Legen Sie die maximale Breite/Höhe gemäß den Browseranforderungen für die Leinwand fest
  • Teilen und erobern Sie mit mehreren Canvas-Elementen und geben Sie ein Array zurück.
  • Geben Sie einen Fehler in der Konsole aus, der Sie zu den Canvas-Einschränkungen berät, und schlagen Sie Möglichkeiten zur Implementierung vor.

In meinem Fall klone ich den gesamten Körper und setze nur die maximale Breite/Höhe: html2canvas(el, {height: 3000, width: 3000}) .

Alle 16 Kommentare

ich habe genau das gleiche Problem wie du. Haben Sie hierfür eine Lösung gefunden?

emm, ich habe das gleiche Problem, aber endlich habe ich es herausgefunden!
In meinem Fall hier meine Lösung:
füge einen iframe in dein Körperelement ein, wie

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

und jedes Element, das Sie auf die Leinwand übertragen müssen, können Sie kopieren und in diesen iframe einfügen und html2canvas verwenden und es dann wie folgt entfernen

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

Ist das immer noch ein Problem mit v1.0.0 ? Wenn ja, könnten Sie bitte ein Beispiel auf jsfiddle teilen .

Dieses Problem wurde automatisch geschlossen, da unsere Anfrage nach weiteren Informationen vom ursprünglichen Autor nicht beantwortet wurde. Mit den Informationen, die derzeit in der Ausgabe enthalten sind, haben wir nicht genügend Informationen, um Maßnahmen zu ergreifen. Bitte wenden Sie sich an uns, wenn Sie die Antworten haben oder finden, die wir benötigen, damit wir weitere Nachforschungen anstellen können.

Hallo, wenn ich versuche, einen iframe mit einer internen IP-Kamera zu überprüfen, wird ein leeres Bild zurückgegeben. Können Sie mir bitte helfen?

@niklasvh Dies ist eine schwierige

  • Legen Sie die maximale Breite/Höhe gemäß den Browseranforderungen für die Leinwand fest
  • Teilen und erobern Sie mit mehreren Canvas-Elementen und geben Sie ein Array zurück.
  • Geben Sie einen Fehler in der Konsole aus, der Sie zu den Canvas-Einschränkungen berät, und schlagen Sie Möglichkeiten zur Implementierung vor.

In meinem Fall klone ich den gesamten Körper und setze nur die maximale Breite/Höhe: html2canvas(el, {height: 3000, width: 3000}) .

@toadkicker Bruder, du speicherst heute meinen Code/Job hahahahahahahaht vielen Dank

@toadkicker Danke!

emm, ich habe das gleiche Problem, aber endlich habe ich es herausgefunden!
In meinem Fall hier meine Lösung:
füge einen iframe in dein Körperelement ein, wie

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

und jedes Element, das Sie auf die Leinwand übertragen müssen, können Sie kopieren und in diesen iframe einfügen und html2canvas verwenden und es dann wie folgt entfernen

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

Ich habe diese Methode ausprobiert, funktioniert aber nicht genau. Auf meine Art funktioniert es mit folgendem Code:

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

Und wenn Sie Ihren CSS-Stil wie im aktuellen Dokument anwenden möchten, müssen Sie auch den Stil in iframe kopieren:

// add style
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'your_style_file_url.css';
canvas_handler.contentDocument.head.appendChild(link);

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

Auch dies ist eine Einschränkung im Browser selbst und diese Bibliothek behandelt den Fehler nicht richtig. Keine Codierungslösung außer der Begrenzung der Anzahl der erfassten Pixel wird dies ändern.

emm, ich habe das gleiche Problem, aber endlich habe ich es herausgefunden!
In meinem Fall hier meine Lösung:
füge einen iframe in dein Körperelement ein, wie

<html>
  <head>
  #canvas_handler {
   position:absolute;
   left: -10000px;
  }
  </head>
  <body>
  <iframe id="canvas_handler" />
  </body>
</html>

und jedes Element, das Sie auf die Leinwand übertragen müssen, können Sie kopieren und in diesen iframe einfügen und html2canvas verwenden und es dann wie folgt entfernen

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
      useCORS: true,
     }).then((canvas) => {
       // do your things
     });
canvas_handler.removeChild(table_ele);

Ich habe diese Methode ausprobiert, funktioniert aber nicht genau. Auf meine Art funktioniert es mit folgendem Code:

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

Und wenn Sie Ihren CSS-Stil wie im aktuellen Dokument anwenden möchten, müssen Sie auch den Stil in iframe kopieren:

// add style
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'your_style_file_url.css';
canvas_handler.contentDocument.head.appendChild(link);

const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
  useCORS: true,
}).then((canvas) => {
  // do your things
  canvas_handler.removeChild(copy_ele);
});

In meinem Fall sind alle Elemente im SVG- oder Inline-Stil, sodass ich kein Stylesheet anhängen muss. aber ja, Sie sollten Ihr Stylesheet bei Bedarf hinzufügen

Ich habe das gleiche Problem gehabt. Ich musste ein Bild aus dem modalen Fenster (mit fester Position) erstellen. Ich habe immer ein weißes Bild erhalten. Das Problem lag in der Scroll-Position. Dieser Code funktioniert bei mir:

const el = document.getElementById('html-to-canvas-area')
const area = el.getBoundingClientRect()
html2canvas(el, {
  scrollX: 0,
  scrollY: 0,
  width: area.width,
  height: area.height
})

Hat für mich wie ein Zauber funktioniert! Danke für die clevere Lösung!

@invisor Lebensretter! Das ist das einzige was bei mir funktioniert hat.

Diese Option könnte auch eine Lösung für das Scrollen verwandter Fälle sein

{
  scrollX: 0,
  scrollY: -window.scrollY
}

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen