Html2canvas не захватывает текст в текстовой области в SVG

Я работаю над приложением на основе узлов Angular, узлы в котором представляют собой html-таблицы, содержащие <textarea>. Когда я пытаюсь создать предварительный просмотр проекта с помощью html2canvas, ни текст в <textarea>, ни <mat-icons> не отображается, возможно, это та же проблема.

Демо: https://stackblitz.com/edit/stackblitz-starters-zjkz5q

Вот ожидание/результат:

А также html-структура компонента:

пожалуйста, поделитесь минимальным воспроизводимым кодом, если возможно, стекблицом с воспроизведенной проблемой

Naren Murali 31.07.2024 11:49

@НаренМурали, конечно! Отредактировал вопрос

Gleb Kiva 31.07.2024 12:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Пожалуйста, попробуйте использовать приведенный ниже код:

  import {
  ChangeDetectorRef,
  Component,
  ElementRef,
  ViewChild,
} from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';
import html2canvas from 'html2canvas';
import { Node, VflowComponent, VflowModule } from 'ngx-vflow';
import { NgIf } from '@angular/common';

@Component({
  selector: 'app-root',
  standalone: true,
  template: `
    <div #contentContainer>
      <vflow [nodes] = "nodes" [background] = "{type: 'dots'}">
        <ng-template nodeHtml let-ctx>
          <table>
            <tr>
              <textarea #textArea>Initial Text</textarea>
            </tr>
          </table>
        </ng-template>
      </vflow>
    </div>
    <button (click) = "capture()">Capture</button>
    <ng-content *ngIf = "capturedImage">
      <img width = "100%" [src] = "capturedImage">
    </ng-content>
  `,
  imports: [VflowModule, NgIf],
})
export class App {
  @ViewChild('contentContainer') screen!: ElementRef;
  @ViewChild('textArea') textArea!: ElementRef;
  nodes: Node[] = [
    {
      id: '1',
      point: { x: 100, y: 100 },
      type: 'html-template',
    },
  ];
  capturedImage: string = '';

  constructor(private changeDetectorRef: ChangeDetectorRef) {}

  capture(): void {
    // Update the textarea's value before capturing
    const textarea = this.screen.nativeElement.querySelector('textarea');
    if (textarea) {
      textarea.innerHTML = textarea.value;
    }

    html2canvas(this.screen.nativeElement, {
      useCORS: true,
      foreignObjectRendering: true,
    }).then((canvas) => {
      this.capturedImage = canvas.toDataURL('image/png');
      this.changeDetectorRef.detectChanges();
    });
  }
}

bootstrapApplication(App);

разве это не тот же код, что и у меня (который не работает)? я не могу найти никаких различий

Gleb Kiva 01.08.2024 09:16

@GlebKiva Я отредактировал код, проверьте сейчас.

Viji_Pykara 01.08.2024 10:37

Другое решение, которое я только что нашел, — использовать пакет dom-to-image:

@Component({
    selector: 'app-root',
    standalone: true,
    template: `
        <vflow id = "flow" #flow [nodes] = "nodes" [background] = "{type: 'dots'}">
            <ng-template nodeHtml let-ctx>
                <table style = "background: red; padding: 20px;">
                    <tr>
                        <textarea></textarea>
                    </tr>
                </table>
            </ng-template>
        </vflow>
        <button (click) = "captureWithDomToImage()">dom-to-image</button>
        <img [src] = "capturedImage" *ngIf = "capturedImage">

    `,
    imports: [VflowModule, NgIf],
})
export class App {
    capturedImage: string = '';
    nodes: Node[] = [
        {
            id: '1',
            point: {x: 100, y: 100},
            type: 'html-template',
        },
    ];

    captureWithDomToImage(): void {
        domtoimage.toPng(document.getElementById('flow')!)
            .then((dataUrl) => this.capturedImage = dataUrl);
    }
}

bootstrapApplication(App);

Другие вопросы по теме