-1

I am tying to use custom fontello font in Canvas so I can export the icon as PNG, but I am getting only an empty square - ⎕ This is the outcome no matter which code I use from this font: enter image description here

So basically I am trying to use it like this:

 ctx.font = `30px fontello`;
 ctx.fillText('\ue804', canvas.width / 2, canvas.height / 2);
 const image = canvas.toDataURL('image/png');

The font is correctly loaded in the document, I've been using it in other places, also testing to use it like this works:

const span = document.createElement('span');
span.style.fontFamily = 'fontello'
span.innerHTML = '&#xe804'
document.body.appendChild(span)

I also tried

ctx.font = `30px "fontello"`;
ctx.fillText('\\ue804', canvas.width / 2, canvas.height / 2);
ctx.fillText('\uE804', canvas.width / 2, canvas.height / 2);
ctx.fillText('&#xe804', canvas.width / 2, canvas.height / 2);
ctx.fillText('&#xE804', canvas.width / 2, canvas.height / 2);

All of the above does not work. Any suggestions will be appreciated.

const canvas = document.createElement('canvas');
                canvas.width = 30; 
                canvas.height = 30; 
                const ctx = canvas.getContext('2d');
                const circleStrokeColor = filter.filter_color.polyline; 
                const circleFillColor = filter.filter_color.polygon; 
                const circleRadius = Math.min(canvas.width, canvas.height) / 2 - 1;
                ctx.strokeStyle = this.hexToRgb(circleStrokeColor);
                ctx.fillStyle = this.hexToRgb(circleFillColor);
                ctx.beginPath();
                ctx.arc(canvas.width / 2, canvas.height / 2, circleRadius, 0, 2 * Math.PI);
                ctx.fill();
                ctx.lineWidth = 1;
                ctx.stroke();
                ctx.fillStyle = this.hexToRgb(circleStrokeColor);
                ctx.textAlign = 'center';
                ctx.textBaseline = 'middle';
                ctx.font = `30px fontello`;
                ctx.fillText('\ue804', canvas.width / 2, canvas.height / 2);
                const image = canvas.toDataURL('image/png');
                console.log(image)
                return image
@font-face {
  font-family: 'fontello';
  src: url('../font/fontello.eot?41849995');
  src: url('../font/fontello.eot?41849995#iefix') format('embedded-opentype'),
       url('../font/fontello.woff2?41849995') format('woff2'),
       url('../font/fontello.woff?41849995') format('woff'),
       url('../font/fontello.ttf?41849995') format('truetype'),
       url('../font/fontello.svg?41849995#fontello') format('svg');
  font-weight: normal;
  font-style: normal;
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
  @font-face {
    font-family: 'fontello';
    src: url('../font/fontello.svg?41849995#fontello') format('svg');
  }
}
*/
[class^="icon-"]:before, [class*=" icon-"]:before {
  font-family: "fontello";
  font-style: normal;
  font-weight: normal;
  speak: never;

  display: inline-block;
  text-decoration: inherit;
  width: 1em;
  margin-right: .2em;
  text-align: center;
  /* opacity: .8; */

  /* For safety - reset parent styles, that can break glyph codes*/
  font-variant: normal;
  text-transform: none;

  /* fix buttons height, for twitter bootstrap */
  line-height: 1em;

  /* Animation center compensation - margins should be symmetric */
  /* remove if not needed */
  margin-left: .2em;

  /* you can be more comfortable with increased icons size */
  /* font-size: 120%; */

  /* Font smoothing. That was taken from TWBS */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;

  /* Uncomment for 3D effect */
  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}

.icon-gebouwen:before { content: '\e800'; } /* '' */
.icon-groen:before { content: '\e801'; } /* '' */
.icon-kabels-leidingen:before { content: '\e802'; } /* '' */
.icon-kunstwerken:before { content: '\e803'; } /* '' */
.icon-legenda:before { content: '\e804'; } /* '' */
.icon-meubilair:before { content: '\e805'; } /* '' */
.icon-riolering:before { content: '\e806'; } /* '' */
.icon-rioolgemalen:before { content: '\e807'; } /* '' */
.icon-speeltoestellen:before { content: '\e808'; } /* '' */
.icon-spoor-masten:before { content: '\e809'; } /* '' */
.icon-sport:before { content: '\e80a'; } /* '' */
.icon-verhardingen:before { content: '\e80b'; } /* '' */
.icon-verlichting:before { content: '\e80c'; } /* '' */
.icon-vri:before { content: '\e80d'; } /* '' */
.icon-water:before { content: '\e80e'; } /* '' */
  • 1
    Nothing in your question shows that you waited for the font to be loaded before you use it. CSS will "redraw" after (or wait until) the font has actually loaded. Canvas can't do that. You need to tell your script to wait. And for this, you can use the `document.fonts.ready` Promise. – Kaiido May 10 '23 at 02:42
  • Thanks you are right adding a div in the raw html with the needed font fixed my problem. I did not know that the fonts are loaded when they are used. I thought they are initialized with the css in the initial load of the document. – Delyan Ninov May 10 '23 at 04:14

1 Answers1

0

Text elements are rendered from bottom (baseline position) to top

Y-coordinates in fillText() define the baseline position so ctx.fillText('\ue804', 0, 0); will render your text off-canvas.

canvas.width = 30;
canvas.height = 30;

document.fonts.ready.then((e) => {
  const ctx = canvas.getContext("2d");
  ctx.font = "30px fontello";
  ctx.fillText("\ue832", 0, 26);
  const dataURL = canvas.toDataURL("image/png");
  btnDownload.href=dataURL;
  dataUrlText.value = dataURL;
  //console.log(dataURL)
});
@font-face {
    font-family: 'fontello';
    src: url('data:font/woff2;charset=utf-8;base64,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') format('woff2');
    font-weight: normal;
    font-style: normal;
}


p{
  font-family:fontello
}


canvas{
  border: 1px solid #ccc
}
<p class="fontello">&#xe832;</p>
<canvas id="canvas"></canvas>
<textarea id="dataUrlText" style="width:100%; min-height:20em;"></textarea>
<a href="" id="btnDownload" download="icon.png">Download</a>
herrstrietzel
  • 11,541
  • 2
  • 12
  • 34