Java实现swf图片转pdf的示例代码

 更新时间:2026年05月15日 09:35:03   作者:孙690342  
本文介绍了一种将SWF文件中的多张图片提取并转换为PDF文件的方法,首先,通过pom依赖提取SWF文件中的图片,然后将这些图片转换为PDF格式,整个过程中,详细测试了该方法的可行性和有效性,需要的朋友可以参考下

pom 依赖

<!-- 操作swf文件 -->
<dependency>
    <groupId>com.flagstone</groupId>
    <artifactId>transform</artifactId>
    <version>3.0.2</version>
</dependency>
<!-- 操作pdf文件 -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.27</version>
</dependency>

提取 swf 中的图片

package com.xxx.demo.common.util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.DataFormatException;

import javax.imageio.ImageIO;

import com.flagstone.transform.Movie;
import com.flagstone.transform.MovieTag;
import com.flagstone.transform.image.DefineImage;
import com.flagstone.transform.image.DefineImage2;
import com.flagstone.transform.image.DefineJPEGImage;
import com.flagstone.transform.image.DefineJPEGImage2;
import com.flagstone.transform.image.DefineJPEGImage3;
import com.flagstone.transform.image.DefineJPEGImage4;
import com.flagstone.transform.util.image.BufferedImageEncoder;

public final class SwfUtils {

	private SwfUtils () {}
	
	public static List<BufferedImage> querySwfImages (final File file) throws DataFormatException, IOException {
		Movie movie = new Movie();
		movie.decodeFromFile(file);
		return querySwfImages(movie);
	}
	
	public static List<BufferedImage> querySwfImages (final URL url) throws DataFormatException, IOException {
		Movie movie = new Movie();
		movie.decodeFromUrl(url);
		return querySwfImages(movie);
	}
	
	public static List<BufferedImage> querySwfImages (final InputStream stream) throws DataFormatException, IOException {
		Movie movie = new Movie();
		movie.decodeFromStream(stream);
		return querySwfImages(movie);
	}
	
	private static List<BufferedImage> querySwfImages (Movie movie) throws DataFormatException, IOException {
		List<BufferedImage> imageList = new ArrayList<>();
		List<MovieTag> list = movie.getObjects();
		for (MovieTag movieTag : list) {
			BufferedImage bi = getSwfImage(movieTag);
			if (bi != null) {
				imageList.add(bi);
			}
		}
		return imageList;
	}
	
	private static BufferedImage getSwfImage (MovieTag movieTag) throws DataFormatException, IOException {
		BufferedImage bi = null;
		if (movieTag instanceof DefineImage) {
			BufferedImageEncoder imageEncoder = new BufferedImageEncoder();
			imageEncoder.setImage((DefineImage) movieTag);
			bi = imageEncoder.getBufferedImage();
		} else if (movieTag instanceof DefineImage2) {
			BufferedImageEncoder imageEncoder = new BufferedImageEncoder();
			imageEncoder.setImage((DefineImage2) movieTag);
			bi = imageEncoder.getBufferedImage();
		} else if (movieTag instanceof DefineJPEGImage) {
			try (
					ByteArrayInputStream bis = new ByteArrayInputStream(((DefineJPEGImage) movieTag).getImage());
					) {
				bi = ImageIO.read(bis);
			}
		} else if (movieTag instanceof DefineJPEGImage2) {
			try (
					ByteArrayInputStream bis = new ByteArrayInputStream(((DefineJPEGImage2) movieTag).getImage());
					) {
				bi = ImageIO.read(bis);
			}
		} else if (movieTag instanceof DefineJPEGImage3) {
			try (
					ByteArrayInputStream bis = new ByteArrayInputStream(((DefineJPEGImage3) movieTag).getImage());
					) {
				bi = ImageIO.read(bis);
			}
		} else if (movieTag instanceof DefineJPEGImage4) {
			try (
					ByteArrayInputStream bis = new ByteArrayInputStream(((DefineJPEGImage4) movieTag).getImage());
					) {
				bi = ImageIO.read(bis);
			}
		}
		return bi;
	}

}

多张图片转为 pdf

package com.xxx.demo.common.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

public final class PdfUtils {

	private PdfUtils () {}
	
	public static void image2pdf (List<BufferedImage> imageList, File outFile) throws IOException {
		if (imageList.isEmpty()) {
			throw new IOException("image not found");
		}
		try (
				PDDocument doc = new PDDocument();
				) {
			doc.save(outFile);
			image2pdf(doc, imageList);
			doc.save(outFile);
		}
	}
	
	public static void image2pdf (List<BufferedImage> imageList, OutputStream out) throws IOException {
		if (imageList.isEmpty()) {
			throw new IOException("image not found");
		}
		try (
				PDDocument doc = new PDDocument();
				) {
			image2pdf(doc, imageList);
			doc.save(out);
		}
	}
	
	
	private static void image2pdf (final PDDocument doc, List<BufferedImage> imageList) throws IOException {
		doc.setAllSecurityToBeRemoved(true);
		for (BufferedImage image : imageList) {
			PDImageXObject pdImage = JPEGFactory.createFromImage(doc, image, 0.8f);
			image.flush();
			PDPage page = new PDPage(PDRectangle.A4);
			try (
					PDPageContentStream contents = new PDPageContentStream(doc, page);
					) {
				int width = pdImage.getWidth();
				int height = pdImage.getHeight();
				float pageWidth = PDRectangle.A4.getWidth();
				float pageHeight = PDRectangle.A4.getHeight();
				float[] bound = getBound(width, height, pageWidth, pageHeight);
				contents.drawImage(pdImage, bound[0], bound[1], bound[2], bound[3]);
			}
			doc.addPage(page);
		}
	}
	
	private static float[] getBound (int width, int height, float pageWidth, float pageHeight) {
		float[] bound = new float[] {0.0f, 0.0f, 0.0f, 0.0f};
		float wh = width * 1.0f / height;
		float pwh = pageWidth * 1.0f / pageHeight;
		if (Math.abs(wh - pwh) < 0.02f) {
			bound[0] = 0.0f;
			bound[1] = 0.0f;
			bound[2] = pageWidth;
			bound[3] = pageHeight;
		} else if (wh - pwh > 0) {
			float h = pageWidth / width * height;
			bound[0] = 0.0f;
			bound[1] = Math.max(pageHeight / 2 - h / 2, 0.0f);
			bound[2] = pageWidth;
			bound[3] = Math.min(h, pageHeight);
		} else {
			float w = pageHeight / height * width;
			bound[0] = Math.max(pageWidth / 2 - w / 2, 0.0f);
			bound[1] = 0.0f;
			bound[2] = Math.min(w, pageWidth);
			bound[3] = pageHeight;
		}
		return bound;
	}

}

swf 中的图片转 pdf

package com.xxx.demo.common.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.DataFormatException;

public final class Swf2PdfUtils {
	
	private Swf2PdfUtils () {}

	public static void swfImage2Pdf (File swfFile, File pdfFile) throws DataFormatException, IOException {
		List<BufferedImage> images = SwfUtils.querySwfImages(swfFile);
		PdfUtils.image2pdf(images, pdfFile);
	}
	
	public static void swfImage2Pdf (File swfFile, OutputStream out) throws DataFormatException, IOException {
		List<BufferedImage> images = SwfUtils.querySwfImages(swfFile);
		PdfUtils.image2pdf(images, out);
	}
	
	public static void swfImage2Pdf (InputStream input, File pdfFile) throws DataFormatException, IOException {
		List<BufferedImage> images = SwfUtils.querySwfImages(input);
		PdfUtils.image2pdf(images, pdfFile);
	}
	
	public static void swfImage2Pdf (InputStream input, OutputStream out) throws DataFormatException, IOException {
		List<BufferedImage> images = SwfUtils.querySwfImages(input);
		PdfUtils.image2pdf(images, out);
	}

}

测试

public static void main(String[] args) throws DataFormatException, IOException {
	File swFile = new File("D:/ceshi", "dabf077a8c354a74.swf");
	File pdfFile = new File("D:/ceshi", "dabf077a8c354a74.pdf");
	Swf2PdfUtils.swfImage2Pdf(swFile, pdfFile);
}

到此这篇关于Java实现swf图片转pdf的示例代码的文章就介绍到这了,更多相关Java swf图片转pdf内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot @RestControllerAdvice全局异常处理最佳实践

    Spring Boot @RestControllerAdvice全局异常处理最佳实践

    本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统一响应格式、异常分类处理及减少冗余代码的重要性,涵盖注解解析、实战代码、最佳实践,感兴趣的朋友一起看看吧
    2025-07-07
  • RabbitMQ消息有效期与死信的处理过程

    RabbitMQ消息有效期与死信的处理过程

    利用DLX,当消息在一个队列中变成死信 (dead message) 之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX,本文重点给大家介绍RabbitMQ消息有效期与死信的相关知识,感兴趣的朋友跟随小编一起看看吧
    2022-03-03
  • SpringBoot使用Redisson实现延迟执行的完整示例

    SpringBoot使用Redisson实现延迟执行的完整示例

    这篇文章主要介绍了SpringBoot使用Redisson实现延迟执行的完整示例,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • IntelliJ IDEA中如何构建Spring Boot的项目

    IntelliJ IDEA中如何构建Spring Boot的项目

    这篇文章主要介绍了IntelliJ IDEA中如何构建Spring Boot的项目问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • nacos配置中心远程调用读取不到配置文件的解决

    nacos配置中心远程调用读取不到配置文件的解决

    这篇文章主要介绍了nacos配置中心远程调用读取不到配置文件的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • spring boot项目自定义参数校验规则示例详解

    spring boot项目自定义参数校验规则示例详解

    这篇文章主要介绍了spring boot项目如何自定义参数校验规则,自定义校验规则和自带的规则实现方式一样,先自定义一个注解,然后指定校验类,在校验类里实现具体的校验规则,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Java数据库连接_jdbc-odbc桥连接方式(详解)

    Java数据库连接_jdbc-odbc桥连接方式(详解)

    下面小编就为大家带来一篇Java数据库连接_jdbc-odbc桥连接方式(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Springboot应用gradle Plugin示例详解

    Springboot应用gradle Plugin示例详解

    这篇文章主要介绍了Springboot应用gradle Plugin详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Java8新特性Optional类及新时间日期API示例详解

    Java8新特性Optional类及新时间日期API示例详解

    这篇文章主要为大家介绍了Java8新特性Optional类及新时间日期API示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 使用ByteArrayOutputStream写入字符串方式

    使用ByteArrayOutputStream写入字符串方式

    这篇文章主要介绍了使用ByteArrayOutputStream写入字符串方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论