#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? Поскольку служба все еще может предоставлять интерфейс, вы можете передавать ему параметры при обращении к нему в контроллере.