Mango.Nop.Plugins/Nop.Plugin.Misc.AIPlugin/Services/PdfToImageService.cs

97 lines
2.6 KiB
C#

using Microsoft.AspNetCore.Hosting;
using PDFtoImage;
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
public class PdfToImageService
{
private readonly PdfiumBootstrapper _pdfiumBootstrapper;
public PdfToImageService(IWebHostEnvironment env)
{
_pdfiumBootstrapper = new PdfiumBootstrapper(env);
}
public async Task<List<string>> ConvertPdfToJpgAsync(string pdfPath, string outputFolder)
{
_pdfiumBootstrapper.EnsurePdfiumLoaded();
var imagePaths = new List<string>();
try
{
Directory.CreateDirectory(outputFolder);
await Task.Run(() =>
{
byte[] pdfBytes = File.ReadAllBytes(pdfPath);
var options = new RenderOptions
{
Dpi = 300,
BackgroundColor = SKColors.White
};
var pdfImages = PDFtoImage.Conversion.ToImages(pdfBytes, options: options);
int pageNumber = 1;
foreach (var page in pdfImages)
{
var outputPath = Path.Combine(outputFolder, $"page_{pageNumber}.jpg");
using (var fileStream = File.Create(outputPath))
{
page.Encode(fileStream, SKEncodedImageFormat.Jpeg, 90);
}
imagePaths.Add(outputPath);
page.Dispose();
pageNumber++;
}
});
return imagePaths;
}
catch (Exception ex)
{
throw new Exception($"Error converting PDF to images: {ex.Message}", ex);
}
}
public class PdfiumBootstrapper
{
private readonly IWebHostEnvironment _env;
private bool _loaded = false;
public PdfiumBootstrapper(IWebHostEnvironment env)
{
_env = env;
}
public void EnsurePdfiumLoaded()
{
if (_loaded)
return;
var pluginPath = Path.Combine(
_env.ContentRootPath,
"Plugins",
"Misc.FruitBankPlugin" // <- change this
);
var archFolder = Environment.Is64BitProcess ? "win-x64" : "win-x86";
var dllPath = Path.Combine(pluginPath, "runtimes", archFolder, "native", "pdfium.dll");
if (!File.Exists(dllPath))
throw new FileNotFoundException($"Pdfium.dll not found: {dllPath}");
NativeLibrary.Load(dllPath);
_loaded = true;
}
}
}