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