有什么办法,我可以将 HTML 文档(文件不是 URL)转换为图像,或将 PDF 转换为图像?
我可以使用 Ghostscript DLL 完成上述操作,有没有其他方法,我可以做到这一点,而不使用 Ghostscript DLL?
我正在开发一个 C# Windows 应用程序。
有什么办法,我可以将 HTML 文档(文件不是 URL)转换为图像,或将 PDF 转换为图像?
我可以使用 Ghostscript DLL 完成上述操作,有没有其他方法,我可以做到这一点,而不使用 Ghostscript DLL?
我正在开发一个 C# Windows 应用程序。
最好和免费的 nuget 包,您可以将 Pdf 的每一页保存为 png 并使用自定义 resilution Docnet.core,这可以在 .net 核心项目中使用。
他们有 github 和很好的例子,但在这里我想添加我的代码来阅读更多的一页的 en pdf
string webRootPath = _hostingEnvironment.WebRootPath;
string fullPath = webRootPath + "/uploads/user-manual/file.pdf";
string fullPaths = webRootPath + "/uploads/user-manual";
using (var library = DocLib.Instance)
{
using (var docReader = library.GetDocReader(fullPath, 1080, 1920))
{
for (int i = 1; i < docReader.GetPageCount(); i++)
{
using (var pageReader = docReader.GetPageReader(i))
{
var bytes = EmailTemplates.GetModifiedImage(pageReader);
System.IO.File.WriteAllBytes(fullPaths+"/page_image_" +i+".png", bytes);
}
}
}
}
您可以在他们的 github 存储库中找到其他功能。
使用LibPdf,用于 PDF 到图像的转换
LibPdf库将 PDF 文件转换为图像。支持的图像格式是 PNG 和 BMP,但您可以轻松添加更多格式。
使用示例:
using (FileStream file = File.OpenRead(@"..\path\to\pdf\file.pdf")) // in file
{
var bytes = new byte[file.Length];
file.Read(bytes, 0, bytes.Length);
using (var pdf = new LibPdf(bytes))
{
byte[] pngBytes = pdf.GetImage(0,ImageType.PNG); // image type
using (var outFile = File.Create(@"..\path\to\pdf\file.png")) // out file
{
outFile.Write(pngBytes, 0, pngBytes.Length);
}
}
}
ImageMagick,您还应该看看这个免费提供且功能强大的工具。它能够做你想做的事,还提供了一些 .NET 绑定(以及与其他几种语言的绑定)。
最简单的形式,就像写一个命令
convert file.pdf imagefile.png
您可以使用以下任何一个库进行 PDF 到图像的转换
使用下面的 Aspose.pdf 链接: http ://www.aspose.com/docs/display/pdfnet/Convert+all+PDF+pages+to+JPEG+Images
代码示例:
Aspose.Pdf.Document pdfDocument = new Aspose.Pdf.Document(MyPdfPath));
using (FileStream imageStream = new FileStream(MyOutputImage.png, FileMode.Create))
{
Resolution resolution = new Resolution(300);
PngDevice pngDevice = new PngDevice(resolution);
pngDevice.Process(pdfDocument.Pages[PageNo], MyOutputImage);
imageStream.Close();
}
使用下面的 Bytescout PDF Renderer 链接: http ://bytescout.com/products/developer/pdfrenderersdk/convert-pdf-to-png-basic-examples
代码示例:
MemoryStream ImageStream = new MemoryStream();
RasterRenderer renderer = new RasterRenderer();
renderer.RegistrationName = "demo";
renderer.RegistrationKey = "demo";
// Load PDF document.
renderer.LoadDocumentFromFile(FilePath);
for (int i = 0; i < renderer.GetPageCount(); i++)
{
// Render first page of the document to PNG image file.
renderer.RenderPageToStream(i, RasterOutputFormat.PNG, ImageStream);
}
Image im = Image.FromStream(ImageStream);
im.Save("MyOutputImage.png");
ImageStream.Close();
试试 Freeware.Pdf2Png,查看以下网址:
PDF转PNG转换器。
byte[] png = Freeware.Pdf2Png.Convert(pdf, 1);
https://www.nuget.org/packages/Freeware.Pdf2Png/1.0.1?_src=template
它说麻省理工学院的许可证。
使用docnet,基于github上的这个例子,我做到了,非常简单和实用:
//...
using Docnet.Core;
using System.IO;
using Docnet.Core.Models;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
//paths
string pathPdf = @"C:\pathToPdfFile\lorem-ipsum.pdf";
string finalPathWithFileName = @"C:\pathToFinalImageFile\finalFile.png";
//using docnet
using (var docReader = DocLib.Instance.GetDocReader(pathPdf, new PageDimensions(1080, 1920)))
{
//open pdf file
using (var pageReader = docReader.GetPageReader(0))
{
var rawBytes = pageReader.GetImage();
var width = pageReader.GetPageWidth();
var height = pageReader.GetPageHeight();
var characters = pageReader.GetCharacters();
//using bitmap to create a png image
using (var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb))
{
AddBytes(bmp, rawBytes);
using (var stream = new MemoryStream())
{
//saving and exporting
bmp.Save(stream, ImageFormat.Png);
File.WriteAllBytes(finalPathWithFileName, stream.ToArray());
};
};
};
};
//extra methods
private static void AddBytes(Bitmap bmp, byte[] rawBytes)
{
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var bmpData = bmp.LockBits(rect, ImageLockMode.WriteOnly, bmp.PixelFormat);
var pNative = bmpData.Scan0;
Marshal.Copy(rawBytes, 0, pNative, rawBytes.Length);
bmp.UnlockBits(bmpData);
}
虽然使用带有 ImageMagick 的 Ghostscript 是一个潜在的选择,但它非常慢,每页大约需要 5 秒或更长时间。DocNet 是将 pdf 转换为图像的更好选择。以下代码会将 pdf 文件中的所有页面转换为图像,并且速度很快。
public void SavePDFtoJPGDocnet(string fileName)
{
string FilePath = @"C:\SampleFileFolder\doc.pdf";
string DestinationFolder = @"C:\SampleFileFolder\";
IDocLib DocNet = DocLib.Instance;
//you are specifying the max resolution of image on any side, actual resolution will be limited by longer side,
//preserving the aspect ratio
var docReader = DocNet.GetDocReader(
FilePath,
new PageDimensions(1440, 2560));
for (int i = 0; i < docReader.GetPageCount(); i++)
{
using (var pageReader = docReader.GetPageReader(i))
{
var rawBytes = pageReader.GetImage();
var width = pageReader.GetPageWidth();
var height = pageReader.GetPageHeight();
var characters = pageReader.GetCharacters();
var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
DocnetClass.AddBytes(bmp, rawBytes);
//DocnetClass.DrawRectangles(bmp, characters);
var stream = new MemoryStream();
bmp.Save(stream, ImageFormat.Png);
File.WriteAllBytes(DestinationFolder + "/page_image_" + i + ".png", stream.ToArray());
}
}
}
Spire.PDF库可用于 PDF 到图像的转换,例如 PDF 到 PNG、JPG、EMF 和 TIFF 等。
以下代码示例展示了如何将 PDF 转换为 PNG:
//Load a PDF
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("PdfFilePath");
//Save to PNG images
for (int i = 0; i < doc.Pages.Count; i++)
{
String fileName = String.Format("ToImage-img-{0}.png", i);
using (Image image = doc.SaveAsImage(i,300,300))
{
image.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
}
}
doc.Close();
如果有人想使用Ghostscript.NET。
Ghostscript.NET -(用 C# 编写)是围绕 Ghostscript 库(32 位和 64 位)最完整的托管包装库,它是 PostScript 语言 PDF 的解释器。
它取决于您必须在机器上安装的可执行文件。这是一个链接,您可以从中查看和下载最新版本的 exe。
PS 我在最新版本 9.50 无法计算页数时遇到了一些麻烦。
我更喜欢使用 9.26 版本。
https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs926/gs926aw32.exe
https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs926/gs926aw64.exe
下一步是从 Nuget 查找并安装 Ghostscript.NET。我从 CDN url 下载 PDF 并使用MemoryStream打开和处理 PDF 文件。这是一个示例代码:
using (WebClient myWebClient = new WebClient())
{
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
{
/* custom switches can be added before the file is opened
rasterizer.CustomSwitches.Add("-dPrinted");
*/
byte[] buffer = myWebClient.DownloadData(pdfUrl);
using (var ms = new MemoryStream(buffer))
{
rasterizer.Open(ms);
var image = rasterizer.GetPage(0, 0, 1);
var imageURL = "MyCDNpath/Images/" + filename + ".png";
_ = UploadFileToS3(image, imageURL);
}
}
}
您也可以将它与临时 FileStream 一起使用。这是另一个例子。请注意,该文件是临时的并且具有 DeleteOnClose 标记。
using (WebClient myWebClient = new WebClient())
{
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
{
/* custom switches can be added before the file is opened
rasterizer.CustomSwitches.Add("-dPrinted");
*/
byte[] buffer = myWebClient.DownloadData(pdfUrl);
int bufferSize = 4096;
using (var fileStream = System.IO.File.Create("TempPDFolder/" + pdfName, bufferSize, System.IO.FileOptions.DeleteOnClose))
{
// now use that fileStream to save the pdf stream
fileStream.Write(buffer, 0, buffer.Length);
rasterizer.Open(fileStream);
var image = rasterizer.GetPage(0, 0, 1);
var imageURL = "MyCDNpath/Images/" + filename + ".png";
_ = UploadFileToS3(image, imageURL);
}
}
}
希望它能帮助那些努力从 pdf 免费获取高质量图像的人。