Html2canvas: Tag teks dalam SVG tumpang tindih (digandakan/digandakan)

Dibuat pada 19 Feb 2015  ·  24Komentar  ·  Sumber: niklasvh/html2canvas

(Maaf, saya tidak pandai bahasa Inggris)

Halo,
Saya menggunakan skrip yang luar biasa ini untuk membuat tag SVG
Ada beberapa teks yang tumpang tindih ketika saya merender tag teks di SVG ke kanvas
Tag teks diproses sebagai simpul Teks dan juga SVG
Anda dapat melihatnya dengan mudah dengan mengubah properti
2015-02-19 15 08 29_2
Berikut adalah contoh kode (dengan html2canvas 0.5.0-alpha2)

<html>
<head>
  <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
  <script type="text/javascript" src="js/html2canvas.js"></script>
</head>
<body>
  <svg width="100" height="100">
    <g transform="translate(20,20)">
      <text dy=".45em" y="10" x="0" dx="-.8em" transform="translate(0,0) rotate(-70)" style="font-size:12px;">Text</text>
    </g>
  </svg>
  <script>
    $(document).ready(function() {
      html2canvas(document.body, {
        onrendered: function(canvas) {
          document.body.appendChild(canvas);
        }
      });
    })
  </script>
</body>
</html

Dan inilah perubahan cepat saya

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

Saya harap ini akan membantu

Needs More Information

Komentar yang paling membantu

@hyojin
Setelah mengujinya di IE, perbaikan Anda tidak berfungsi karena properti parentElement tidak terisi pada simpul saat ini. Gunakan parentNode sebagai gantinya! Bagaimanapun, itu akan lebih jelas karena kita masuk ke NodeParser dan berbicara tentang node.js.

Jika tidak, alih-alih menguji nama tag, saya mengubah kode saya untuk menguji instance parentNode dan memproses node saat ini memiliki TextContainer hanya jika parentNode bukan SVGElement .

Ini berfungsi pada chrome dan ie11. di firefox saya tidak dapat mengujinya karena bug kanvas kosong!

kode saya

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

Saya harap ini membantu.

Semua 24 komentar

Terima kasih #Hyojin. Itu membantu saya.

Terima kasih, banyak membantu saya!

Terima kasih atas perbaikan Anda!

anda juga dapat memeriksa tspan tagName :
node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" && node.parentElement.tagName !== "tspan"

@ncoquelet saya memperbarui kode saya. Terima kasih!

@hyojin
Setelah mengujinya di IE, perbaikan Anda tidak berfungsi karena properti parentElement tidak terisi pada simpul saat ini. Gunakan parentNode sebagai gantinya! Bagaimanapun, itu akan lebih jelas karena kita masuk ke NodeParser dan berbicara tentang node.js.

Jika tidak, alih-alih menguji nama tag, saya mengubah kode saya untuk menguji instance parentNode dan memproses node saat ini memiliki TextContainer hanya jika parentNode bukan SVGElement .

Ini berfungsi pada chrome dan ie11. di firefox saya tidak dapat mengujinya karena bug kanvas kosong!

kode saya

NodeParser.prototype.getChildren = function(parentContainer) {
    return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
        var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
        return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
    }, this));
};

Saya harap ini membantu.

perbaiki masalah firefox saya, berfungsi juga di ff :-)

Lebih jelas!
Saya juga memeriksa apakah itu berfungsi dengan baik di ff.
Saya menggabungkan perbaikan Anda dan permintaan tarik telah diperbarui. Terima kasih :)

@hyojin @ncoquelet terima kasih atas penyelidikannya dan perbaikannya. Saya mengalami masalah yang sama beberapa hari yang lalu dan saya tidak sepenuhnya yakin apa yang menyebabkannya.

Saya tidak yakin di mana saya menjadi bingung di sini, tetapi saya mendapatkan pengecualian karena "Error Referensi Tidak Tertangkap: NodeParser tidak ditentukan"

@Suchetana10 Kapan Anda mendapatkan pengecualian? dalam memuat skrip?

@hyojin terima kasih.. bekerja untuk saya

@hyojin terima kasih! bekerja dengan sempurna untuk saya juga

happyvishwasvadavi ugnugen Saya senang mendengarnya! :)

Beberapa orang masih memiliki masalah dengan elemen teks, saya mengubah masalah ini dibuka dan saya akan mengirim PR lagi.

image

Adakah yang punya build perpustakaan dengan perbaikan ini di dalamnya yang bisa saya uji? Melihat masalah yang sama di halaman grafik tinggi..

Apakah build ini tersedia dengan perbaikan? Saya masih menghadapi masalah ini dengan grafik tinggi.

Apakah perbaikan ini tersedia di build atau kita harus membuat override ?

Apakah ini masih menjadi masalah dengan v1.0.0 ? Jika demikian, dapatkah Anda membagikan contoh di jsfiddle .

Masalah ini telah ditutup secara otomatis karena belum ada tanggapan atas permintaan kami untuk informasi lebih lanjut dari penulis asli. Dengan hanya informasi yang sedang dalam masalah, kami tidak memiliki cukup informasi untuk mengambil tindakan. Harap hubungi jika Anda memiliki atau menemukan jawaban yang kami butuhkan sehingga kami dapat menyelidiki lebih lanjut.

Dear @niklasvh ,

Terima kasih untuk perpustakaan yang luar biasa ini. Saya dapat mereproduksi masalah ini dengan versi terbaru - v1.0.0-rc.3

Saya telah membuat contoh pada CodePen di sini (khusus Chrome) di mana Anda akan melihat bahwa beberapa simpul teks (dalam judul Grafik) diduplikasi.

Langkah-langkah untuk mereproduksi -

  1. Silakan buka tautan CodePen - https://codepen.io/karannagupta/pen/RXpddB hanya di Chrome
  2. Klik tombol Salin ke Papan Klip
  3. Tunggu hingga animasi selesai (atau lihat konsol untuk pesan yang disalin)
  4. Tempel grafik di cat atau dokumen (ctrl + v)

Judul grafik ditambahkan pada Baris #193

@hyojin , maukah Anda membuka masalah ini lagi?

Salam,
Karan



text-duplication

Hai @karannagupta
Bisakah Anda mencoba cabang saya untuk memeriksa apakah itu berasal dari alasan yang sama?

Hai @hyojin

Dengan versi perpustakaan Anda (v0.5.0-alpha2) itu tidak berfungsi. Anda dapat menguji perpustakaan Anda

Juga, saya ingin menggunakan html2canvas versi terbaru. Saya juga tidak perlu menggunakan html2canvas.svg.

Salam,
Karan

Ternyata ini adalah masalah dengan font Unicode

image

Apakah halaman ini membantu?
0 / 5 - 0 peringkat