c# - 在 .NET Core 2.0 中合并 PDF 并将 PDF 转换为 PNG 图像

标签 c# asp.net-core .net-core asp.net-core-mvc

我正在寻找可以支持将 pdf 合并为一个并将合并的 pdf 转换为一个 .PNG 图像文件的第三方 .dll。

我知道 Ghostscript 或 pdfsharp 支持 .NET 框架,但不支持 .NET core 2.0 框架。

如果有人可以建议任何第三方 dll,它可以合并所有 PDF 并将合并的 pdf 转换为 .NET core 2.0 中的 PNG 图像。

对于实现这个要求有什么帮助或建议吗?

最佳答案

我只是回答有关在 .NET Core 3.1 中呈现 PDF 并将其转换为图像的部分,这花了几天时间才弄清楚。我最终使用 phuldr 的 Docnet.Core 获取图像字节并使用 Magick.NET-Q16-AnyCpu 将其保存到图像文件。

将图像字节重新排列为 RGBA 顺序并将透明像素转换为特定颜色(在我的例子中为白色)需要一些额外的工作。如果有帮助,这是我的代码:

public MemoryStream PdfToImage(byte[] pdfBytes /* the PDF file bytes */)
{
    MemoryStream memoryStream = new MemoryStream();
    MagickImage imgBackdrop;
    MagickColor backdropColor = MagickColors.White; // replace transparent pixels with this color 
    int pdfPageNum = 0; // first page is 0

    using (IDocLib pdfLibrary = DocLib.Instance)
    {
        using (var docReader = pdfLibrary.GetDocReader(pdfBytes, new PageDimensions(1.0d)))
        {
            using (var pageReader = docReader.GetPageReader(pdfPageNum))
            {
                var rawBytes = pageReader.GetImage(); // Returns image bytes as B-G-R-A ordered list.
                rawBytes = RearrangeBytesToRGBA(rawBytes);
                var width = pageReader.GetPageWidth();
                var height = pageReader.GetPageHeight();

                // specify that we are reading a byte array of colors in R-G-B-A order.
                PixelReadSettings pixelReadSettings = new PixelReadSettings(width, height, StorageType.Char, PixelMapping.RGBA);
                using (MagickImage imgPdfOverlay = new MagickImage(rawBytes, pixelReadSettings))
                {
                    // turn transparent pixels into backdrop color using composite: http://www.imagemagick.org/Usage/compose/#compose
                    imgBackdrop = new MagickImage(backdropColor, width, height);                            
                    imgBackdrop.Composite(imgPdfOverlay, CompositeOperator.Over);
                }
            }
        }
    }

    
    imgBackdrop.Write(memoryStream, MagickFormat.Png);
    imgBackdrop.Dispose();
    memoryStream.Position = 0;
    return memoryStream;
}

private byte[] RearrangeBytesToRGBA(byte[] BGRABytes)
{
    var max = BGRABytes.Length;
    var RGBABytes = new byte[max];
    var idx = 0;
    byte r;
    byte g;
    byte b;
    byte a;
    while (idx < max)
    {
        // get colors in original order: B G R A
        b = BGRABytes[idx];
        g = BGRABytes[idx + 1];
        r = BGRABytes[idx + 2];
        a = BGRABytes[idx + 3];

        // re-arrange to be in new order: R G B A
        RGBABytes[idx] = r;
        RGBABytes[idx + 1] = g;
        RGBABytes[idx + 2] = b;
        RGBABytes[idx + 3] = a;

        idx += 4;
    }
    return RGBABytes;
}

关于c# - 在 .NET Core 2.0 中合并 PDF 并将 PDF 转换为 PNG 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49493671/

相关文章:

c# - 如何创建 MySql 更新命令以与 DataGridView 一起使用?

c# - 如何在转换为 json 时格式化对象中仅为字符串的属性?

asp.net - 使用 ASP.NET Core 和 EntityFramework 7 通过 Azure 中的迁移更改来更新生产数据库

c# - 带有 Active Directory 的 IdentityServer 4

c# - Xml 序列化为 XmlAttribute : namespace prefix lost when Element in same namespace

c# - Amazon S3 .net SDK - 在一个请求中删除多个对象

asp.net-core - ASP.NET Core 2 - 使用 IISExpress 使用自定义域名和 ssl 进行开发

c# - 如何访问 MVC .net 核心中返回的 Controller 的字段结果

caching - Gitlab CI 和 .NET Core - 无法通过 2 阶段构建获取 nuget 缓存

.net - 两个引用程序集之间的冲突