Hello!
I need a help. In .net Core 3.1 (using docker Linux) I receive a message:
"The type initializer for 'spr?' threw an exception." -> "Cannot found font installed on the system."
My Code:
using Spire.Pdf;
using Spire.Pdf.General.Find;
using Spire.Pdf.Graphics;
using Spire.Pdf.Grid;
using Spire.Pdf.HtmlConverter;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using System.IO;
using System.Linq;
namespace assinatura.documento.api.netcore.Util
{
[ExcludeFromCodeCoverage]
public static class PdfUtil
{
public static string InsereImagemNoPdf(string base64Documento, string base64Imagem, float larguraImg, float alturaImg, string textoSubs = "", bool textInicio = true, float fatorCorrecaoX = 0, float fatorCorrecaoY = 0)
{
return InsereImagemNoPdf(base64Documento, base64Imagem, larguraImg, alturaImg, null, null, textoSubs, textInicio, fatorCorrecaoX, fatorCorrecaoY);
}
public static string InsereImagemNoPdf(string base64Documento, string base64Imagem, float larguraImg, float alturaImg, float? posicaoX, float? posicaoY, string textoSubs = "", bool textInicio = true, float fatorCorrecaoX = 0, float fatorCorrecaoY = 0)
{
ConstroiGridRow(base64Documento, out var nomeArquivoPdf, out var pdfDocument, out var pdfPageBase, out var pdfGrid, out var pdfGridRow);
RealizaCalculoTamanhos(base64Imagem, larguraImg, alturaImg, pdfPageBase, pdfGrid, out var pdfGridCellContentList, out var nomeArquivoImg);
CalculaCelulas(pdfGridRow, pdfGridCellContentList);
if ((posicaoX.HasValue && posicaoY.HasValue) || string.IsNullOrEmpty(textoSubs))
return SalvaNoArquivo(posicaoX.Value, posicaoY.Value, nomeArquivoPdf, pdfDocument, pdfPageBase, pdfGrid,
nomeArquivoImg);
var pointF = ReturnPositionTextPdf(pdfDocument, textoSubs, textInicio);
posicaoX = pointF.X + fatorCorrecaoX;
posicaoY = pointF.Y + fatorCorrecaoY;
return SalvaNoArquivo(posicaoX.Value, posicaoY.Value, nomeArquivoPdf, pdfDocument, pdfPageBase, pdfGrid, nomeArquivoImg);
}
public static string ConverteStringHtmlToBase64Html(string stringHtml)
{
var htmlToPdf = new SelectPdf.HtmlToPdf();
if (!Directory.Exists("Arquivos"))
Directory.CreateDirectory("Arquivos");
if (!Directory.Exists(@"Arquivos\Conversoes"))
Directory.CreateDirectory(@"Arquivos\Conversoes");
var nomeArquivoSalvo = @$"Arquivos\Conversoes\{Guid.NewGuid()}.html";
var htmlString = htmlToPdf.ConvertHtmlString(stringHtml);
htmlString.Save(nomeArquivoSalvo);
var pdfDocument = new PdfDocument(nomeArquivoSalvo);
using var memoryStream = new MemoryStream();
pdfDocument.SaveToStream(memoryStream);
var bytes = memoryStream.ToArray();
File.Delete(nomeArquivoSalvo);
var base64String = Convert.ToBase64String(bytes);
return base64String;
}
private static string SalvaNoArquivo(float posicaoX, float posicaoY, string nomeArquivoPdf, PdfDocument pdfDocument, PdfPageBase pdfPageBase, PdfGrid pdfGrid, string nomeArquivoImg)
{
pdfGrid.Draw(pdfPageBase, new PointF(posicaoX, posicaoY));
using var memoryStream = new MemoryStream();
pdfDocument.SaveToStream(memoryStream);
var bytes = memoryStream.ToArray();
File.Delete(nomeArquivoImg);
File.Delete(nomeArquivoPdf);
return Convert.ToBase64String(bytes);
}
private static void CalculaCelulas(PdfGridRow pdfGridRow, PdfGridCellContentList pdfGridCellContentList)
{
pdfGridRow.Cells[0].Value = pdfGridCellContentList;
pdfGridRow.Cells[0].Style.Borders.Top.Color = PdfRGBColor.Empty;
pdfGridRow.Cells[0].Style.Borders.Bottom.Color = PdfRGBColor.Empty;
pdfGridRow.Cells[0].Style.Borders.Left.Color = PdfRGBColor.Empty;
pdfGridRow.Cells[0].Style.Borders.Right.Color = PdfRGBColor.Empty;
}
private static void RealizaCalculoTamanhos(string base64Imagem, float larguraImg, float alturaImg, PdfPageBase pdfPageBase, PdfGrid pdfGrid, out PdfGridCellContentList pdfGridCellContentList, out string nomeArquivoImg)
{
pdfGridCellContentList = new PdfGridCellContentList();
PdfGridCellContent pdfGridCellContent = new PdfGridCellContent();
var byteImagem = Convert.FromBase64String(base64Imagem);
if (!Directory.Exists("Arquivos"))
Directory.CreateDirectory("Arquivos");
if (!Directory.Exists(@"Arquivos\Conversoes"))
Directory.CreateDirectory(@"Arquivos\Conversoes");
nomeArquivoImg = @$"Arquivos\Conversoes\{Guid.NewGuid()}.png";
File.WriteAllBytes(nomeArquivoImg, byteImagem);
pdfGridCellContent.Image = PdfImage.FromFile(nomeArquivoImg);
pdfGridCellContent.ImageSize = new SizeF(larguraImg, alturaImg);
pdfGridCellContentList.List.Add(pdfGridCellContent);
}
private static void ConstroiGridRow(string base64Documento, out string nomeArquivoPdf, out PdfDocument pdfDocument, out PdfPageBase pdfPageBase, out PdfGrid pdfGrid, out PdfGridRow pdfGridRow)
{
var bytesPdf = Convert.FromBase64String(base64Documento);
if (!Directory.Exists("Arquivos"))
Directory.CreateDirectory("Arquivos");
if (!Directory.Exists(@"Arquivos\Conversoes"))
Directory.CreateDirectory(@"Arquivos\Conversoes");
nomeArquivoPdf = @$"Arquivos\Conversoes\{Guid.NewGuid()}.pdf";
File.WriteAllBytes(nomeArquivoPdf, bytesPdf);
pdfDocument = new PdfDocument(bytesPdf);
pdfPageBase = pdfDocument.Pages[0];
pdfGrid = new PdfGrid();
pdfGridRow = pdfGrid.Rows.Add();
pdfGrid.Columns.Add(1);
}
public static PointF ReturnPositionTextPdf(PdfDocument document, string word, bool inicio = true)
{
var finds = document.Pages[0].FindText(word, TextFindParameter.None).Finds;
return inicio ? finds.FirstOrDefault().Position : finds.LastOrDefault().Position;
}
public static string JuntarDoisEmUm(string base64Documento1, string base64Documento2)
{
var bytesPdf1 = Convert.FromBase64String(base64Documento1);
if (!Directory.Exists("Arquivos"))
Directory.CreateDirectory("Arquivos");
if (!Directory.Exists(@"Arquivos\Conversoes"))
Directory.CreateDirectory(@"Arquivos\Conversoes");
var nomeArquivoPdf1 = @$"Arquivos\Conversoes\{Guid.NewGuid()}.pdf";
File.WriteAllBytes(nomeArquivoPdf1, bytesPdf1);
var pdfDocumentFinal = new PdfDocument(bytesPdf1);
var bytesPdf2 = Convert.FromBase64String(base64Documento2);
var nomeArquivoPdf2 = @$"Arquivos\Conversoes\{Guid.NewGuid()}.pdf";
File.WriteAllBytes(nomeArquivoPdf2, bytesPdf2);
var pdfDocument2 = new PdfDocument(bytesPdf2);
pdfDocumentFinal.AppendPage(pdfDocument2);
using var memoryStream = new MemoryStream();
pdfDocumentFinal.SaveToStream(memoryStream);
var bytes = memoryStream.ToArray();
File.Delete(nomeArquivoPdf1);
File.Delete(nomeArquivoPdf2);
return Convert.ToBase64String(bytes);
}
}
}