【问题标题】:Convert PDF to Image without using Ghostscript DLL在不使用 Ghostscript DLL 的情况下将 PDF 转换为图像
【发布时间】:2012-10-01 15:44:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: c#


    【解决方案1】:

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

    【讨论】:

    • 我不确定为什么这不是公认的答案。 Docnet 就像一个魅力。
    • 对于想知道的人来说,它是 Googles Pdfium 的包装器
    • 这不是一个完整的例子,您使用了一个未定义的GetModifiedImage函数。
    【解决方案2】:

    使用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
    

    【讨论】:

    • 非常感谢,我仍然收到异常“无法加载文件或程序集'libpdf.DLL'或其依赖项之一。找不到指定的模块。”?
    • 我也遇到了同样的问题,我的应用程序是 .net framework 4。有人可以建议如何解决这个问题
    • 是否仅根据 Google 搜索推荐了 LibPDF?提供的代码示例只是从他们的页面复制而来。问题是,据我所知,这个库不起作用。我搞砸了一个或两个小时,但没有成功。有不少人在问题日志中发布他们也无法使其正常工作。
    • ImageMagick 使用 GhostScript 转换 PDF。
    • 不明白为什么当没有人可以让它工作时,它被接受为答案。
    【解决方案3】:

    您可以使用以下任何一个库进行 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();
    

    【讨论】:

    • aspose.pdf 可以免费使用吗?
    • Aspose 提供试用版和购买许可证。
    • 他们提供一个月的试用版。试用期结束后,您必须购买它。
    【解决方案4】:

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

    PDF 到 PNG 转换器。

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

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

    上面写着 MIT 许可证。

    【讨论】:

    • 这是一个被低估的答案,Freeware.Pdf2Png 就这么简单!对我来说,这是最好的答案!
    【解决方案5】:

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

    pdf used in this example.

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

    【讨论】:

    • 结束使用 Docnet 并根据所示示例启动并运行一个可行的解决方案。
    【解决方案6】:

    虽然将 Ghostscript 与 ImageMagick 结合使用是一种可能的选择,但它的速度非常慢,每页大约需要 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());
    
                }
            }
    
               
            
    
           
        }
    

    【讨论】:

      【解决方案7】:

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

      更多转换示例可以在库的documentation 中找到。它还提供了free community edition,但有一些限制。

      【讨论】:

        【解决方案8】:

        如果有人想使用 Ghostscript.NET

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

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

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

        附:我遇到了一些问题,最新版本 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 免费获取高质量图像的人。

        【讨论】:

        • 请注意,ghostscript 使用 AGPL 许可证,您不能直接从闭源程序链接到 DLL。如果您链接到 ghostscript,您必须提供整个应用程序的源代码,或者从 Artifex 购买商业许可证。这就是为什么 imagemagick 使用 gs 命令行程序而不是调用库的原因。见artifex.com/licensing
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 2011-12-30
        • 2015-12-14
        • 2023-04-08
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多