azure 将SVGDocument转换为位图时,无法以PNG、JPG格式加载字体

4si2a6ki  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(179)

我使用SVG-Net从SVG创建PNG,JPG文件。
我面临的问题是,字体不是呈现在PNG,JPG从SVG,虽然当我查看我的SVG,字体显示。下面是我的代码:

var svgContent = svgDocument.ToString();
var mySvg = SvgDocument.FromSvg<SvgDocument>(svgContent);

mySvg.Height = new SvgUnit(SvgUnitType.Pixel, pixelHeight);
mySvg.Width = new SvgUnit(SvgUnitType.Pixel, pixelWidth);
mySvg.ViewBox = new SvgViewBox(0, 0, viewBoxWidth, viewBoxHeight);

Bitmap bmpSquare = mySvg.Draw(pixelWidth, pixelHeight);
bmpSquare.Save(FilePathJPG, jgpEncoder,myEncoderParameters);
bmpSquare.Save(FilePathPNG, pngEncoder,myEncoderParameters);

我有ttf文件,当我在C:/Windows/Fonts中本地安装字体时,它在我的本地工作。但是当我的Azure Function应用程序部署时,这是不可行的。有没有一种方法可以在Azure上的PaaS上安装字体?
对于SVG在添加字体,并添加base64格式的ttf文件。或者有没有一种方法可以渲染我正在使用的SVG-Net库中的字体。下面是我在SVG中使用的代码:

<defs>
        <style>
            @font-face {
            font-family:Segoe Pro Bold;
            src: url("data:font/truetype;charset=utf-8;base64, bas64 conversion of my font TTF file") format('truetype');
            }
        </style>
</defs>

使用上面的代码显示了我的SVG上的字体,但是当我将Bitmap &保存转换为PNG & JPG时,它会呈现默认字体。
我离最后期限很近了,我已经完成了最困难的事情,但仍然坚持这个关键问题。先谢谢你了。

bhmjp9jg

bhmjp9jg1#

svg-net不支持嵌入字体,据我所知,svg-net完全依赖于基于操作系统的字体解析。但是,您可以利用Azure VM或基于容器的Azure App Service Web Apps来安装自定义字体。此外,还有Azure Container Apps hosting of Azure Functions的预览。
对于基于容器的函数设置,docker文件应类似于以下示例

FROM mcr.microsoft.com/azure-functions/dotnet:4 AS base
RUN apt-get update && apt-get install -y libgdiplus
RUN apt-get update; apt-get install -y fontconfig fonts-liberation
RUN fc-cache -f -v
COPY FunctionAppSvgToPngContainer/fonts/ /usr/shared/fonts
COPY FunctionAppSvgToPngContainer/fonts/ /usr/share/fonts/truetype
RUN fc-cache -f -v
# use "fc-list" in terminal to check the list of installed fonts
WORKDIR /home/site/wwwroot
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["FunctionAppSvgToPngContainer/FunctionAppSvgToPngContainer.csproj", "FunctionAppSvgToPngContainer/"]
RUN dotnet restore "FunctionAppSvgToPngContainer/FunctionAppSvgToPngContainer.csproj"
COPY . .
WORKDIR "/src/FunctionAppSvgToPngContainer"
RUN dotnet build "FunctionAppSvgToPngContainer.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "FunctionAppSvgToPngContainer.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /home/site/wwwroot
COPY --from=publish /app/publish .
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true

在添加了安装字体的行之后,azure函数中带有svg-net的示例svg renderd从x1c 0d1x更改为


使用的示例svg:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xml="http://www.w3.org/XML/1998/namespace" viewBox="0, 0, 240, 80">
  <style>
    .small {
    font: italic 13px Liberation Serif;
    }
    .heavy {
    font: bold 30px Segoe Pro;
    }

    /* Note that the color of the text is set with the *
    * fill property, the color property is for HTML only */
    .Rrrrr {
    font: italic 40px Segoe Pro;
    fill: red;
    }
  </style>
  <text x="20" y="35" font-size="13px" font-style="italic" class="small">My</text>
  <text x="40" y="35" font-size="30px" font-weight="bold" class="heavy">cat</text>
  <text x="55" y="55" font-size="13px" font-style="italic" class="small">is</text>
  <text x="65" y="55" font-size="40px" font-style="italic" class="Rrrrr" style="fill:red;">Grumpy!</text>
</svg>

相关问题