17

有什么办法,我可以将 HTML 文档(文件不是 URL)转换为图像,或将 PDF 转换为图像?

我可以使用 Ghostscript DLL 完成上述操作,有没有其他方法,我可以做到这一点,而不使用 Ghostscript DLL?

我正在开发一个 C# Windows 应用程序。

4

8 回答 8

7

最好和免费的 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 存储库中找到其他功能。

于 2020-01-30T12:55:31.760 回答
4

使用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
于 2012-10-11T03:35:05.673 回答
2

您可以使用以下任何一个库进行 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();
于 2012-10-11T04:14:01.153 回答
1

试试 Freeware.Pdf2Png,查看以下网址:

PDF转PNG转换器。

byte[] png = Freeware.Pdf2Png.Convert(pdf, 1);

https://www.nuget.org/packages/Freeware.Pdf2Png/1.0.1?_src=template

它说麻省理工学院的许可证。

于 2021-10-18T01:01:27.033 回答
1

使用docnet,基于github上的这个例子,我做到了,非常简单和实用:

本例中使用的 pdf

//...
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);
}

于 2021-10-21T14:24:58.017 回答
0

虽然使用带有 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());

            }
        }

           
        

       
    }
于 2021-09-07T09:23:18.070 回答
0

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();

更多转换示例可以在库的文档中找到。它还提供免费的社区版,但有一些限制。

于 2021-10-27T03:54:13.577 回答
-1

如果有人想使用Ghostscript.NET

Ghostscript.NET -(用 C# 编写)是围绕 Ghostscript 库(32 位和 64 位)最完整的托管包装库,它是 PostScript 语言 PDF 的解释器。

它取决于您必须在机器上安装的可执行文件。这是一个链接,您可以从中查看和下载最新版本的 exe。

https://www.ghostscript.com/download/gsdnld.html

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 免费获取高质量图像的人。

于 2019-10-22T09:46:54.257 回答