将图像字节数组转换为 PDF

Convert image byte array to PDF

我想将 byte[] 格式的图像(PNG、JPEG、GIF)转换为 PDF。

我目前正在使用这个功能,这个功能有效,但是会把超过一定高度或特定比例的图像底部切掉;例如 500x2000.
我哪里错了?

public byte[] ConvertImageToPDF(byte[] bytes)
{
    byte[] pdfArray;
    using (var memoryStream = new MemoryStream())
    {
        using (var pdfWriter = new PdfWriter(memoryStream))
        {
            var pdf = new PdfDocument(pdfWriter);
            var document = new Document(pdf);
            ImageData imageData = ImageDataFactory.Create(bytes);
            document.Add(new Image(imageData));
            document.Close();
        }
        pdfArray = memoryStream.ToArray();
    }
    return pdfArray;
}

我想你想要的是 auto-scale 文档中图像的 PdfWriter。
或者,将图像放在页面的中央。

您可以更改代码设置 [Image].SetAutoScale(true)[Image].SetHorizontalAlignment(HorizontalAlignment.CENTER):

注意:我已经为iText.Layout.Properties(别名:PdfProperties)和iText.Layout.Element.Image(别名:PdfImage),以避免与具有 类 的其他 .Net 程序集和具有相同确切名称的枚举器发生冲突。删除它们以防万一您根本不需要它们。

using iText.IO.Image;
using iText.Kernel.Pdf;
using iText.Layout;
using PdfProperties = iText.Layout.Properties;
using PdfImage = iText.Layout.Element.Image;

public byte[] ConvertImageToPDF(byte[] imageBytes)
{
    using (var ms = new MemoryStream()) {
        using (var pdfWriter = new PdfWriter(ms)) {
            var pdf = new PdfDocument(pdfWriter);
            var document = new Document(pdf);

            var img = new PdfImage(ImageDataFactory.Create(imageBytes))
                .SetAutoScale(true)
                .SetHorizontalAlignment(PdfProperties.HorizontalAlignment.CENTER);

            document.Add(img);
            document.Close();
            pdf.Close();
            return ms.ToArray();
        }
    }
}

您还可以以浮点单位指定图像的大小,并使用 [Image].ScaleToFit() 方法在这些范围内缩放图像。
在这里,使用 PageSize 设置为 PageSize.A4。您当然可以设置不同的措施。

using iText.Kernel.Geom;

// [...]
var document = new Document(pdf);

var page = document.GetPageEffectiveArea(PageSize.A4);
var img = new PdfImage(ImageDataFactory.Create(imageBytes))
    .ScaleToFit(page.GetWidth(), page.GetHeight())
    .SetHorizontalAlignment(PdfProperties.HorizontalAlignment.CENTER);

// [...]