PDF拆分成图片,图片合并成PDF

感谢您的 查看和帮助!

我在使用Aspose.Pdf API时陷入了深深的疑问?

input:inupt.pdf (93.1 KB)

1,当我把PDF里的图片保存成jpg格式,PDF大小是英寸单位,图片宽和高是像素单位,我该如何知道PDF里面的图片转成jpg格式后,多大的像素才是最佳的,,,有相关的转换API吗?

        //分辨率
        Aspose.Pdf.Devices.Resolution resolution = new Aspose.Pdf.Devices.Resolution(300);

        Aspose.Pdf.Devices.JpegDevice jpegDevice = new Aspose.Pdf.Devices.JpegDevice(resolution, 50);

       string savefilejpg = "";
        //打开文档
        Aspose.Pdf.Document pdfDocument = new Aspose.Pdf.Document(input);

        for (int pageCount = 1; pageCount <= pdfDocument.Pages.Count; pageCount++)
        {

            savefilejpg = $"{out}{filenamejpg}.jpg";

            using (FileStream imageStream = new FileStream(savefilejpg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
            {

                //转换一个特定的页面,并保存图像流
                jpegDevice.Process(pdfDocument.Pages[pageCount], imageStream);
     
                // 封闭河流
                imageStream.Close();

            }


        }

input:jpg.zip (395.5 KB)

2,多个图片,如何合并成一个PDF,假设我有3张jpg,我该如何把这三张jpg放到一个PDF当中,其中一张jpg占一页PDF?
我又该如何知道,jpg合并成PDF,jpg宽和高多少可以填充满当前页的PDF。

@fhn123456

1- 分辨率可以定义为将 PDF 转换为图像时像素的大小。您可以使用单值和双值初始化分辨率,例如 new Resolution(300)new Resolution(150, 150)。除此之外,还可以定义图像质量和页面大小。您能否分享要从 PDF 生成的图像中的预期结果?

2- 如果你想根据 PDF 页面大小添加图像,你可以在下面的代码片段中:

private static void AddImageAccordingToPage(string dataDir)
{
 var pdf = new Aspose.Pdf.Document();
 var pdfImageSection = pdf.Pages.Add();
 DirectoryInfo dir = new DirectoryInfo(dataDir + "images\\");
 FileInfo[] files  = dir.GetFiles("*.jpg");
 foreach (var file in files)
 {
  FileStream stream = new FileStream(file.FullName, FileMode.Open);
  System.Drawing.Image img = new Bitmap(stream);
  img = ScaleImage(img, (int)pdfImageSection.PageInfo.Width, (int)pdfImageSection.PageInfo.Height);
  MemoryStream ms = new MemoryStream();
  img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  ms.Seek(0, SeekOrigin.Begin);
  var image = new Aspose.Pdf.Image { ImageStream = ms };
  pdfImageSection.Paragraphs.Add(image);
 }
 pdf.Save(dataDir + "Image2Pdf_out.pdf");
}

public static System.Drawing.Image ScaleImage(System.Drawing.Image image, int maxWidth, int maxHeight)
{
 var ratioX = (double)maxWidth / image.Width;
 var ratioY = (double)maxHeight / image.Height;
 var ratio = Math.Min(ratioX, ratioY);
 var newWidth = (int)(image.Width * ratio);
 var newHeight = (int)(image.Height * ratio);
 var newImage = new Bitmap(newWidth, newHeight);
 using (var graphics = Graphics.FromImage(newImage))
  graphics.DrawImage(image, 0, 0, newWidth, newHeight);
 return newImage;
}

如果您需要根据图像尺寸指定 PDF 页面大小,可以通过以下代码实现:

Aspose.Pdf.Document doc = new Aspose.Pdf.Document();
Aspose.Pdf.Page page = doc.Pages.Add();
System.Drawing.Image img = new Bitmap(dataDir + "Long Image.jpg");
page.PageInfo.Margin = new MarginInfo(0, 0, 0, 0);
page.PageInfo.Height = img.Height;
page.PageInfo.Width = img.Width;
Aspose.Pdf.Image image1 = new Aspose.Pdf.Image();
image1.File = dataDir + "Long Image.jpg";
page.Paragraphs.Add(image1);
doc.Save(dataDir + "output.pdf");

感谢您的回复和帮助!

1,PDF:inupt.pdf (93.1 KB)
预期结果:jpg.zip (395.5 KB)

2,您提供的参考代码实现了我的功能,您的帮助使我受益匪浅,非常感谢您的帮助!

        DirectoryInfo dir = new DirectoryInfo(dataDir + "images\\");

        FileInfo[] files = dir.GetFiles("*.jpg");

        //创建实例
        Aspose.Pdf.Document doc = new Aspose.Pdf.Document();

        foreach (var file in files)
        {

            string imagesFile = file.FullName;

            //添加一页
            Aspose.Pdf.Page page = doc.Pages.Add();

            System.Drawing.Image img = new Bitmap(imagesFile);
            //边距信息
            page.PageInfo.Margin = new Aspose.Pdf.MarginInfo(0, 0, 0, 0);
            //高
            page.PageInfo.Height = img.Height;
            //宽
            page.PageInfo.Width = img.Width;

            Aspose.Pdf.Image image1 = new Aspose.Pdf.Image();
            //图片路径
            image1.File = imagesFile;
            //段落
            page.Paragraphs.Add(image1);

        }

        doc.Save(dataDir + "output.pdf");

3,ScaleImage()这个缩放方法里面代码都是什么含义,我用bug调试,发现var newImage = new Bitmap(newWidth, newHeight);里面的newWidth和newHeight和传递过来的形参数值是一样的,为什么不直接把形参里面的值赋给它,而是通过计算?

  public static System.Drawing.Image ScaleImage(System.Drawing.Image image, int maxWidth, int maxHeight)
    {
        var ratioX = (double)maxWidth / image.Width;
        var ratioY = (double)maxHeight / image.Height;
        var ratio = Math.Min(ratioX, ratioY);
        var newWidth = (int)(image.Width * ratio);
        var newHeight = (int)(image.Height * ratio);
        var newImage = new Bitmap(newWidth, newHeight);
        using (var graphics = Graphics.FromImage(newImage))
            graphics.DrawImage(image, 0, 0, newWidth, newHeight);
        return newImage;
    }

@fhn123456

ScaleMethod() 可帮助您在添加到 PDF 时保持图像的纵横比。例如,如果图像是横向的,并且您将其添加到纵向模式的 A4 尺寸页面上,它会被挤压和缩小,导致看起来很糟糕。所以这个方法会根据提供的高度和宽度调整图像的纵横比。请注意,此方法不是 API 功能的一部分。它只是用C#编写的自定义方法,以获得某些好处。

您好,感谢您的回复和帮助!
谢谢您!