DinkToPdf, включающий изображение в HtmlContent

#c# #asp.net #asp.net-core-webapi #dinktopdf

#c# #asp.net #asp.net-core-webapi #dinktopdf

Вопрос:

У меня есть счет-фактура в формате PDF, созданный с использованием .Net Core 3 Web API DinkToPdf библиотеки and.

Теперь мне нужно вставить в pdf изображение в качестве подписи. Я создал папку ресурсов своего проекта и добавил изображение с Copy to Output Directory установленным значением allways . Но я не знаю, как использовать его в моем строковом значении, которое содержит все данные pdf.

  var htmlDoc = new StringBuilder();
 ...
 htmlDoc.AppendLine("<td>");

 // here I need to insert the image
 Stream imgStream = Assembly.GetExecutingAssembly()
  .GetManifestResourceStream("Project.Resources.signature.jpeg"); // is allways null
 or
 htmlDoc.AppendLine("<img src="Project.Resources.signature.jpeg" />");

 htmlDoc.AppendLine("</td>");

 var doc = new HtmlToPdfDocument()
 {
     GlobalSettings = {
         ColorMode = ColorMode.Color,
         Orientation = Orientation.Landscape,
         PaperSize = PaperKind.A4Plus,
         Margins = new MarginSettings() { Top = 10, Left = 30, Right = 30 }
     },
     Objects = {
         new ObjectSettings() {
             PagesCount = true,
             HtmlContent = htmlDoc.ToString(),
             WebSettings = { DefaultEncoding = "utf-8" }
         }
     }
 };

 var pdf = converter.Convert(doc);
 var stream = new MemoryStream(pdf);
 var contentType = @"application/pdf";
 var fileName = $"Invoice_{entity.Id}.pdf";
 stream.Seek(0, SeekOrigin.Begin);
 
 return File(stream, contentType, fileName);
  

Startup.cs:

 services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
  

Редактировать: Я обнаружил, что абсолютный путь работает

  htmlDoc.AppendLine("<img src="C/User/Application/Project/Resources/signature.jpeg" />");
  

Но это не оптимальное решение, поскольку абсолютный путь локальной среды отличается от производственной среды.

есть еще идеи? Спасибо

Комментарии:

1. Я хочу знать, какой пакет этот конвертер (var pdf = converter. Преобразовать (doc)) относится к.

2. Я обновил код. IConverter из DinkToPdf, внедряемый в контроллеры там, где это необходимо. Спасибо

Ответ №1:

Рабочий каталог Asp.net Ядро отличается от веб-каталога. Вам нужно добавить папку wwwroot в корневой каталог проекта. Это корневой каталог Интернета.

введите описание изображения здесь

В контроллере получите корневой каталог проекта через IWebHostEnvironment. Вот пример.

 [ApiController]
[Route("dink/")]
public class DinkController:ControllerBase
{
    IConverter converter;
    public IConfiguration Configuration;
    IWebHostEnvironment webHostEnvironment;
    public DinkController(IConverter _converter,IConfiguration configuration,IWebHostEnvironment environment)
    {
        converter = _converter;
        Configuration = configuration;
        webHostEnvironment = environment;
    }
    //[Route("get")]
    public IActionResult get()
    {
        var htmlDoc = new StringBuilder();
        htmlDoc.AppendLine("<td>");
        var path = webHostEnvironment.WebRootPath "\1.png";//It fetches files under wwwroot
        htmlDoc.AppendLine($"<img src="{path}" />");
        htmlDoc.AppendLine("</td>");

        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                 ColorMode = ColorMode.Color,
                 Orientation = Orientation.Landscape,
                 PaperSize = PaperKind.A4Plus,
                 Margins = new MarginSettings() { Top = 10, Left = 30, Right = 30 }
             },
             Objects = {
                 new ObjectSettings() {
                     PagesCount = true,
                     HtmlContent = htmlDoc.ToString(),
                     WebSettings = { DefaultEncoding = "utf-8" }
                 }
             }
        };

        var pdf = converter.Convert(doc);
        var stream = new MemoryStream(pdf);
        var contentType = @"application/pdf";
        var fileName = $"Invoice_Id.pdf";
        stream.Seek(0, SeekOrigin.Begin);

        return File(stream, contentType, fileName);
    }
}
  

Комментарии:

1. Спасибо за ваш ответ. Проблема в том, что мне нужно использовать DinktoPdf в сервисе, который является внешним проектом (зависимость от dll для моего API), и я не могу использовать там IWebHostEnvironment, потому что Startup.cs не существует.

2. У вас есть папка wwwroot? Поскольку служба все еще может предоставлять интерфейс, вы можете передавать ему параметры при обращении к нему в контроллере.