java
复制代码
/**
* @author : maqingbo
* @email : qingbo.my@gmail.com
* @date : 2023/8/8:13:04 周二
*/
public class OfdUtils {
/**
* ofd->img
* @param ofdInputFile
* @param imgOutputFile
* @throws FileNotFoundException
*/
public static void ofd2Img(String ofdInputFile, String imgOutputFile) throws FileNotFoundException {
String tempPdfPath = System.getProperty("java.io.tmpdir") + File.separator + "temp.pdf";
ofd2Pdf(ofdInputFile, tempPdfPath);
pdf2Img(tempPdfPath, imgOutputFile,false);
File file = new File(tempPdfPath);
FileUtil.del(file);
}
/**
* pdf->img
* @param pfdInputFile
* @param imgOutputFile
* @param outLongImage 是否输出长图
*/
public static void pdf2Img(String pfdInputFile, String imgOutputFile,boolean outLongImage) {
if (imgOutputFile.lastIndexOf(".") == -1) {
throw new RuntimeException("PDF转图片失败");
}
String suffix = imgOutputFile.substring(imgOutputFile.lastIndexOf(".") + 1);
String imgFileName = imgOutputFile.substring(0, imgOutputFile.lastIndexOf("."));
List<String> imagePath = new ArrayList<>();
PDDocument document = null;
try {
document = PDDocument.load(new File(pfdInputFile));
PDFRenderer renderer = new PDFRenderer(document);
for (int pageIndex = 0; pageIndex < document.getNumberOfPages(); pageIndex++) {
BufferedImage image = renderer.renderImageWithDPI(pageIndex, 300);
String index = String.format("%03d", pageIndex + 1);
String newFileName = imgFileName.concat("-").concat(index);
File imgFile = new File(newFileName.concat(".").concat(suffix));
ImageIO.write(image, suffix,imgFile);
imagePath.add(imgFile.getAbsolutePath());
}
if (outLongImage){
concatenateImages(imagePath,imgOutputFile);
}
System.out.println("OFD文件已成功转换为图片!");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("PDF转图片失败");
} finally {
if (document != null) {
try {
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 多张图片拼接成一张长图
*
* @param imagePaths
*/
public static void concatenateImages(List<String> imagePaths, String outputImagePath) throws IOException {
// 加载所有图片并获取宽度和高度
BufferedImage[] images = new BufferedImage[imagePaths.size()];
int totalHeight = 0;
int maxWidth = 0;
for (int i = 0; i < imagePaths.size(); i++) {
try {
images[i] = ImageIO.read(new File(imagePaths.get(i)));
} catch (IOException e) {
e.printStackTrace();
throw new IOException();
}
totalHeight += images[i].getHeight();
maxWidth = Math.max(maxWidth, images[i].getWidth());
}
// 创建空白长图
BufferedImage concatImage = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = concatImage.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, maxWidth, totalHeight);
// 拼接图片
int currentHeight = 0;
for (BufferedImage image : images) {
g2d.drawImage(image, 0, currentHeight, null);
currentHeight += image.getHeight();
}
g2d.dispose();
// 保存拼接后的长图
ImageIO.write(concatImage, "PNG", new File(outputImagePath));
//删除零散图片
for (String imagePath : imagePaths) {
FileUtil.del(new File(imagePath));
}
}
/**
* ofd->pdf
* @param ofdInputStream
* @param pdfOutputStream
*/
public static void ofd2Pdf(InputStream ofdInputStream, OutputStream pdfOutputStream) {
ConvertHelper.toPdf(ofdInputStream, pdfOutputStream);
}
public static void ofd2Pdf(String ofdPath, String pdfPath) {
FileInputStream ofdInputStream = null;
FileOutputStream pdfOutputStream = null;
try {
ofdInputStream = new FileInputStream(ofdPath);
pdfOutputStream = new FileOutputStream(pdfPath);
ConvertHelper.toPdf(ofdInputStream, pdfOutputStream);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("OFD转PDF异常");
} finally {
if (ofdInputStream != null) {
try {
ofdInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (pdfOutputStream != null) {
try {
pdfOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}