在 Azure Web App 中将 PDF 转换为图像
Convert a PDF to an Image in Azure Web App
您好,我一直在尝试将 pdf 转换为图像,它在我的本地主机上工作,但在发布到云端时无法工作。
我一直在尝试使用 Devexpress 的 PDFDocument 处理器,但这只适用于本地主机。下面是一些在本地主机上运行但不适用于 Azure Web 应用程序的代码。
public static byte[] streamResult(PdfDocumentProcessor processor, MemoryStream ms)
{
MemoryStream stream = new MemoryStream();
processor.RenderingEngine = PdfRenderingEngine.Skia;
processor.LoadDocument(ms);
for (int i = 1; i <= processor.Document.Pages.Count; i++)
{
//Bitmap image = processor.CreateBitmap(i, 1000);
PdfRectangle cropBox = processor.Document.Pages[0].CropBox;
int actualPageHeight = DevExpress.Office.Utils.Units.PointsToPixels(11 * 72, 96);
int actualPageWidth = DevExpress.Office.Utils.Units.PointsToPixels((Convert.ToInt32(8.5 * 72)), 96);
int cropBoxPageHeight = DevExpress.Office.Utils.Units.PointsToPixels((int)cropBox.Height, 96);
int cropBoxPageWidth = DevExpress.Office.Utils.Units.PointsToPixels((int)cropBox.Width, 96);
//Image image = new System.Drawing.Bitmap(processor.CreateBitmap(i, cropBoxPageHeight));
//image.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
new System.Drawing.Bitmap(processor.CreateBitmap(i, cropBoxPageHeight), actualPageWidth, 1030).Save(stream, System.Drawing.Imaging.ImageFormat.Png);
}
stream.Position = 0;
//return new FileStreamResult(stream, "Png");
return stream.ToArray();
}
根据 Devexpress 的说法,如果我将 PDFRenderingEngine 设置为 Skia,这应该可行,但我已经来回折腾了大约一个月,并尝试了我能想到的一切。我已经安装了 nugget 软件包,例如 Devexpress.PDF.SkiaRenderer 和 SkiaSharp 库。
当我尝试在 Azure 上将 PDF 转换为图像时,出现了一堆小黑框。并且字节数组与本地主机上的完全不同。
我也尝试过使用 PDFium nugget 包,但无法正常工作。我想知道是否有人能够发现我在代码中做错的事情,或者是否有替代解决方案。
我知道 BITMap 默认为 GDI+,我认为这不适用于 azure,但根据 Devexpress 的说法,如果我将渲染引擎更改为 Skia 并使用他们的 CreateBitmap,那么这应该可以工作。
欢迎任何想法。
谢谢,
这是带有 ImageCodecInfo 图像编码器和编码器参数的代码
var encoder = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
List<System.Drawing.Imaging.ImageCodecInfo> list = new List<System.Drawing.Imaging.ImageCodecInfo>();
Guid variable = new Guid();
foreach (System.Drawing.Imaging.ImageCodecInfo code in encoder)
{
if (code.FormatID == System.Drawing.Imaging.ImageFormat.Png.Guid)
{
variable = code.FormatID;
list.Add(code);
}
}
var encParams1 = new System.Drawing.Imaging.EncoderParameters() { Param = new[] { new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L) } };
new System.Drawing.Bitmap(processor.CreateBitmap(i, cropBoxPageHeight), actualPageWidth, 1030).Save(stream, list.Find(x => x.FormatID == variable), encParams1);
一个多月后,我走了一条不同的路。我将此代码移到 HTTP 触发器 azure 函数中,它开始正常工作。我认为这可能只是 DevExpress 中网络应用程序的一个问题,而且它太新了,我不相信他们知道这个错误。
我将继续与他们合作,看看我是否可以提供不需要 azure 函数来使其工作的信息。
您好,我一直在尝试将 pdf 转换为图像,它在我的本地主机上工作,但在发布到云端时无法工作。
我一直在尝试使用 Devexpress 的 PDFDocument 处理器,但这只适用于本地主机。下面是一些在本地主机上运行但不适用于 Azure Web 应用程序的代码。
public static byte[] streamResult(PdfDocumentProcessor processor, MemoryStream ms)
{
MemoryStream stream = new MemoryStream();
processor.RenderingEngine = PdfRenderingEngine.Skia;
processor.LoadDocument(ms);
for (int i = 1; i <= processor.Document.Pages.Count; i++)
{
//Bitmap image = processor.CreateBitmap(i, 1000);
PdfRectangle cropBox = processor.Document.Pages[0].CropBox;
int actualPageHeight = DevExpress.Office.Utils.Units.PointsToPixels(11 * 72, 96);
int actualPageWidth = DevExpress.Office.Utils.Units.PointsToPixels((Convert.ToInt32(8.5 * 72)), 96);
int cropBoxPageHeight = DevExpress.Office.Utils.Units.PointsToPixels((int)cropBox.Height, 96);
int cropBoxPageWidth = DevExpress.Office.Utils.Units.PointsToPixels((int)cropBox.Width, 96);
//Image image = new System.Drawing.Bitmap(processor.CreateBitmap(i, cropBoxPageHeight));
//image.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
new System.Drawing.Bitmap(processor.CreateBitmap(i, cropBoxPageHeight), actualPageWidth, 1030).Save(stream, System.Drawing.Imaging.ImageFormat.Png);
}
stream.Position = 0;
//return new FileStreamResult(stream, "Png");
return stream.ToArray();
}
根据 Devexpress 的说法,如果我将 PDFRenderingEngine 设置为 Skia,这应该可行,但我已经来回折腾了大约一个月,并尝试了我能想到的一切。我已经安装了 nugget 软件包,例如 Devexpress.PDF.SkiaRenderer 和 SkiaSharp 库。
当我尝试在 Azure 上将 PDF 转换为图像时,出现了一堆小黑框。并且字节数组与本地主机上的完全不同。
我也尝试过使用 PDFium nugget 包,但无法正常工作。我想知道是否有人能够发现我在代码中做错的事情,或者是否有替代解决方案。
我知道 BITMap 默认为 GDI+,我认为这不适用于 azure,但根据 Devexpress 的说法,如果我将渲染引擎更改为 Skia 并使用他们的 CreateBitmap,那么这应该可以工作。
欢迎任何想法。
谢谢,
这是带有 ImageCodecInfo 图像编码器和编码器参数的代码
var encoder = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
List<System.Drawing.Imaging.ImageCodecInfo> list = new List<System.Drawing.Imaging.ImageCodecInfo>();
Guid variable = new Guid();
foreach (System.Drawing.Imaging.ImageCodecInfo code in encoder)
{
if (code.FormatID == System.Drawing.Imaging.ImageFormat.Png.Guid)
{
variable = code.FormatID;
list.Add(code);
}
}
var encParams1 = new System.Drawing.Imaging.EncoderParameters() { Param = new[] { new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L) } };
new System.Drawing.Bitmap(processor.CreateBitmap(i, cropBoxPageHeight), actualPageWidth, 1030).Save(stream, list.Find(x => x.FormatID == variable), encParams1);
一个多月后,我走了一条不同的路。我将此代码移到 HTTP 触发器 azure 函数中,它开始正常工作。我认为这可能只是 DevExpress 中网络应用程序的一个问题,而且它太新了,我不相信他们知道这个错误。
我将继续与他们合作,看看我是否可以提供不需要 azure 函数来使其工作的信息。