java做 pdf转换成图片 时出现Unknown CMap: UniGB-UCS2-H?急~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java做 pdf转换成图片 时出现Unknown CMap: UniGB-UCS2-H?急~相关的知识,希望对你有一定的参考价值。

java.io.IOException: Unknown CMap: UniGB-UCS2-H
at com.sun.pdfview.font.PDFCMap.getCMap(PDFCMap.java:67)
at com.sun.pdfview.font.PDFFontEncoding.<init>(PDFFontEncoding.java:73)
at com.sun.pdfview.font.PDFFont.getFont(PDFFont.java:133)
at com.sun.pdfview.PDFParser.getFontFrom(PDFParser.java:1166)
at com.sun.pdfview.PDFParser.iterate(PDFParser.java:719)
at com.sun.pdfview.BaseWatchable.run(BaseWatchable.java:101)
at java.lang.Thread.run(Thread.java:662)
java.io.IOException: Unknown CMap: UniGB-UCS2-H
at com.sun.pdfview.font.PDFCMap.getCMap(PDFCMap.java:67)
at com.sun.pdfview.font.PDFFontEncoding.<init>(PDFFontEncoding.java:73)
at com.sun.pdfview.font.PDFFont.getFont(PDFFont.java:133)
at com.sun.pdfview.PDFParser.getFontFrom(PDFParser.java:1166)
at com.sun.pdfview.PDFParser.iterate(PDFParser.java:719)
at com.sun.pdfview.BaseWatchable.run(BaseWatchable.java:101)
at java.lang.Thread.run(Thread.java:662)

参考技术A 用jasperreport的exportpdffile那个方法生成pdf到指定的磁盘目录下,所有的pdf文件生成是生成了,文件大小也不一.但是打开任何pdf文件都是空白的,不知道为什么,而我换exporthtmlfile的那个方法生成的html文件都能展现正常.由于这个程序是在后台生成文件给mail发送的所以不通过jsp,action的流程,只能在后台指定目录中生成一个pdf文件,然后用mail去调用的.所以不能用response流生成pdf文件.都是通过传来的数据生成的pdf,我其他什么都没有改动,就只是用exportpdffile生成的pdf文件是空白的,但用exporthtmlfile的方法生成的能展现,说明数据源是没问题的.不知道为什么,困绕很久,由于需求只要求传pdf文件,所以不能用html的文件来传送,不知道是不是这两个方法的参数设置有什么不同吗?而且pdf的那两个itext中文包我也导入了,所以不存在字符转换问题追问

你复制也复制一个有点技术含量的,这个回答本人已经看过n次,而且是文不对题

java 实现pdf转换成图片

参考1:java实现pdf转换成图片

来源:java 实现pdf转换成图片_ZZ的博客-CSDN博客_java pdf 转图片

1.maven添加jar

<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox -->
		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>fontbox</artifactId>
			<version>2.0.9</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox</artifactId>
			<version>2.0.9</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>

 2.实现代码

 /**
     * 转换全部的pdf
     * @param fileAddress 文件地址
     * @param filename PDF文件名
     * @param type 图片类型
     */
    public static void pdf2png(String fileAddress,String filename,String type) 
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress+"\\\\"+filename+".pdf");
        try 
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) 
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, type, new File(fileAddress+"\\\\"+filename+"_"+(i+1)+"."+type));
            
         catch (IOException e) 
            e.printStackTrace();
        
    
 
 
/**
     *自由确定起始页和终止页
     * @param fileAddress 文件地址
     * @param filename pdf文件名
     * @param indexOfStart 开始页  开始转换的页码,从0开始
     * @param indexOfEnd 结束页  停止转换的页码,-1为全部
     * @param type 图片类型
     */
    public static void pdf2png(String fileAddress,String filename,int indexOfStart,int indexOfEnd,String type) 
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress+"\\\\"+filename+".pdf");
        try 
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = indexOfStart; i < indexOfEnd; i++) 
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, type, new File(fileAddress+"\\\\"+filename+"_"+(i+1)+"."+type));
            
         catch (IOException e) 
            e.printStackTrace();
        
    

参考2:java中pdf转图片的方法

来源:JAVA中pdf转图片的方法 - PC君 - 博客园

JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用。

一、icepdf。有收费版和开源版,几种方法里最推荐的。转换的效果比较好,能识别我手头文件中的中文,就是转换后可能字体的关系部分字间距有点宽。因为,字体支持是要收费的,所以转换的图片会带有官方的水印。去水印的方法可以查看另一篇文章:icepdf去水印方法

1、下载icepdf的架包,并导入项目中,这里用到4个,如下:

2、附上代码例子:

String filePath = "c:/test.pdf";
  Document document = new Document();
  document.setFile(filePath);
  float scale = 2.5f;//缩放比例
  float rotation = 0f;//旋转角度

  for (int i = 0; i < document.getNumberOfPages(); i++) 
    BufferedImage image = (BufferedImage)
    document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);
    RenderedImage rendImage = image;
    try 
        File file = new File("c:/iecPDF_" + i + ".png");
        ImageIO.write(rendImage, "png", file);
      catch (IOException e) 
        e.printStackTrace();
    
      image.flush();
  
  document.dispose();

例子中是pdf转png格式的,也可以将12、13行改成jpg,转出jpg格式的,但是从转换效果来看png的清晰度会相对较高。有个小技巧是12行改成jpg,但13行使用png,也就是转换成jpg格式但有png清晰度的图片。

二、pdfbox。转换效果还可以,能识别我手中文件大部分内容,有部分内容无法识别。

1、下载pdfbox的架包,并导入项目,这里用到2个,如下:

2、附上代码例子:

File file = new File("c:\\\\test.pdf");
  try 
    PDDocument doc = PDDocument.load(file);
    PDFRenderer renderer = new PDFRenderer(doc);
     int pageCount = doc.getNumberOfPages();
    for(int i=0;i<pageCount;i++)
      BufferedImage image = renderer.renderImageWithDPI(i, 296);
//          BufferedImage image = renderer.renderImage(i, 2.5f);
      ImageIO.write(image, "PNG", new File("C:\\\\pdfbox_image.png"));
    
   catch (IOException e) 
    e.printStackTrace();
  

例子中rederImageWithDPI的第二个参数为dpi分辨率单位,可根据需求调节大小,代码第八行提供了架包里另一种转图片的方法,第二个参数为缩放比。

三、jpedal。效果不太理想,貌似对中文支持不太好,下面的lgpl版本是开源版。

 1、下载jpedal的架包,并导入项目中,如下:

2、附上代码例子:

PdfDecoder decode_pdf = new PdfDecoder(true);
  try 
    decode_pdf.openPdfFile("c:\\\\test.pdf"); //file
//   decode_pdf.openPdfFile("C:/jpedalPDF.pdf", "password"); //encrypted file
//      decode_pdf.openPdfArray(bytes); //bytes is byte[] array with PDF
//      decode_pdf.openPdfFileFromURL("http://www.mysite.com/jpedalPDF.pdf",false);
//      decode_pdf.openPdfFileFromInputStream(in, false);

    int start = 1, end = decode_pdf.getPageCount();
    for(int i = start; i < end+1; i++)
      BufferedImage img=decode_pdf.getPageAsImage(i);
      try 
        ImageIO.write(img, "png", new File("C:\\\\jpedal_image.png"));
       catch (IOException e) 
        e.printStackTrace();
      
    
    decode_pdf.closePdfFile();
   catch (PdfException e) 
    e.printStackTrace();
  

参考3:Java中PDF的转换(图片)与展示

来源:Java中PDF的转换(图片)与展示 - 简书 (jianshu.com)

解决的问题

有些时候我们需要在项目中展示PDF,但是直接在浏览器中加入PDF展示的插件,存在兼容性问题,某些浏览器显示效果不理想,所以我们可以将PDF转为图片,然后已图片的方式展示,效果很好。

那么怎么将PDF转为图片呢?有两种方式:

产品特点
Apache 的 PDF box免费;速度稍慢一点,但可以接受
E-iceblue 的 Spire.PDF for Java转换效果很好;速度快;功能强大,支持转多种格式;收费

Spire.PDF for Java 的转换效果很好,但是如果不购买,转换过后会添加一些水印文字

参考链接:https://www.cnblogs.com/Yesi/p/11233238.html

PDF Box的使用

<dependency>
    <groupId>net.sf.cssbox</groupId>
    <artifactId>pdf2dom</artifactId>
    <version>1.7</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.12</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox-tools</artifactId>
    <version>2.0.12</version>
</dependency>

多页PDF生成多张图片

新建一个 PdfUtil 工具类

public class PdfUtil 

    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(PdfUtil.class);

    /***
     * PDF文件转PNG图片,全部页数
     *
     * @param pdfFilePath pdf完整路径
     * @param dpi dpi越大转换后越清晰,相对转换速度越慢
     */
    public static void pdf2Image(String pdfFilePath, int dpi) 
        File file = new File(pdfFilePath);
        PDDocument pdDocument;
        try 
            String imgPdfPath = file.getParent();
            int dot = file.getName().lastIndexOf('.');
            // 获取图片文件名
            String imagePdfName = file.getName().substring(0, dot);

            pdDocument = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(pdDocument);
            /* dpi越大转换后越清晰,相对转换速度越慢 */
            PdfReader reader = new PdfReader(pdfFilePath);
            int pages = reader.getNumberOfPages();
            StringBuffer imgFilePath;
            for (int i = 0; i < pages; i++) 
                String imgFilePathPrefix = imgPdfPath + File.separator + imagePdfName;
                imgFilePath = new StringBuffer();
                imgFilePath.append(imgFilePathPrefix);
                imgFilePath.append("_");
                imgFilePath.append((i + 1));
                imgFilePath.append(".png");
                File dstFile = new File(imgFilePath.toString());
                BufferedImage image = renderer.renderImageWithDPI(i, dpi);
                ImageIO.write(image, "png", dstFile);
            
            log.info("PDF文档转PNG图片成功!");
         catch (IOException e) 
            e.printStackTrace();
        
    
    

多页PDF组合成一张图片

public class PdfUtil 

    public static final int DEFAULT_DPI = 150;

    /**
     * pdf转图片
     * 多页PDF会每页转换为一张图片,下面会有多页组合成一页的方法
     *
     * @param pdfFile pdf文件路径
     * @param outPath 图片输出路径
     * @param dpi 相当于图片的分辨率,值越大越清晰,但是转换时间变长
     */
    public static void pdf2multiImage(String pdfFile, String outPath, int dpi) 
        if (ObjectUtil.isEmpty(dpi)) 
            // 如果没有设置DPI,默认设置为150
            dpi = DEFAULT_DPI;
        
        try (PDDocument pdf = PDDocument.load(new FileInputStream(pdfFile))) 
            int actSize = pdf.getNumberOfPages();
            List<BufferedImage> picList = Lists.newArrayList();
            for (int i = 0; i < actSize; i++) 
                BufferedImage image = new PDFRenderer(pdf).renderImageWithDPI(i, dpi, ImageType.RGB);
                picList.add(image);
            
            // 组合图片
            ImageUtil.yPic(picList, outPath);
         catch (IOException e) 
            e.printStackTrace();
        
    

新建 ImageUtil 类

public class ImageUtil 

    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ImageUtil.class);

    /**
     * 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同
     *
     * @param picList 文件流数组
     * @param outPath 输出路径
     */
    public static void yPic(List<BufferedImage> picList, String outPath) // 纵向处理图片
        if (picList == null || picList.size() <= 0) 
            log.info("图片数组为空!");
            return;
        
        try 
            // 总高度
            int height = 0,
                    // 总宽度
                    width = 0,
                    // 临时的高度 , 或保存偏移高度
                    offsetHeight = 0,
                    // 临时的高度,主要保存每个高度
                    tmpHeight = 0,
                    // 图片的数量
                    picNum = picList.size();
            // 保存每个文件的高度
            int[] heightArray = new int[picNum];
            // 保存图片流
            BufferedImage buffer = null;
            // 保存所有的图片的RGB
            List<int[]> imgRgb = new ArrayList<int[]>();
            // 保存一张图片中的RGB数据
            int[] tmpImgRgb;
            for (int i = 0; i < picNum; i++) 
                buffer = picList.get(i);
                // 图片高度
                heightArray[i] = offsetHeight = buffer.getHeight();
                if (i == 0) 
                    // 图片宽度
                    width = buffer.getWidth();
                
                // 获取总高度
                height += offsetHeight;
                // 从图片中读取RGB
                tmpImgRgb = new int[width * offsetHeight];
                tmpImgRgb = buffer.getRGB(0, 0, width, offsetHeight, tmpImgRgb, 0, width);
                imgRgb.add(tmpImgRgb);
            
            // 设置偏移高度为0
            offsetHeight = 0;
            // 生成新图片
            BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int i = 0; i < picNum; i++) 
                tmpHeight = heightArray[i];
                if (i != 0) 
                    // 计算偏移高度
                    offsetHeight += tmpHeight;
                
                // 写入流中
                imageResult.setRGB(0, offsetHeight, width, tmpHeight, imgRgb.get(i), 0, width);
            
            File outFile = new File(outPath);
            // 写图片
            ImageIO.write(imageResult, "png", outFile);
         catch (Exception e) 
            e.printStackTrace();
        
    
    

参考4:使用Java将PDF文件转成图片

来源:使用Java将PDF文件转成图片 | IT瘾 (itindex.net)

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import javax.swing.SwingUtilities;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

/**
 * Created by David on 2016/11/15.
 */
public class Pdf2Pic 

    public static void setup() throws IOException 
        // load a pdf from a byte buffer
        File file = new File("/Users/David/Downloads/testoss.pdf");
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel
                .size());
        PDFFile pdffile = new PDFFile(buf);

        System.out.println("页数: " + pdffile.getNumPages());

        String getPdfFilePath = System.getProperty("user.dir")+File.separator+"pdfPicFile";

        //目录不存在,则创建目录
        File p=new File(getPdfFilePath);
        if(!p.exists())
            p.mkdir();
        

        System.out.println("getPdfFilePath is  :"+getPdfFilePath);

        for (int i = 1; i <= pdffile.getNumPages(); i++) 
            // draw the first page to an image
            PDFPage page = pdffile.getPage(i);

            // get the width and height for the doc at the default zoom
            Rectangle rect = new Rectangle(0, 0, (int) page.getBBox()
                    .getWidth(), (int) page.getBBox().getHeight());

            // generate the image
            Image img = page.getImage(rect.width, rect.height, // width &
                    // height
                    rect, // clip rect
                    null, // null for the ImageObserver
                    true, // fill background with white
                    true // block until drawing is done
            );

            BufferedImage tag = new BufferedImage(rect.width, rect.height,
                    BufferedImage.TYPE_INT_RGB);
            tag.getGraphics().drawImage(img, 0, 0, rect.width, rect.height,
                    null);



            FileOutputStream out = new FileOutputStream( getPdfFilePath+File.separator + i + ".jpg"); // 输出到文件流
                    System.out.println("成功保存图片到 :  " +getPdfFilePath+File.separator + i + ".jpg");

            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag); // JPEG编码

            out.close();
        

        // show the image in a frame
        // JFrame frame = new JFrame("PDF Test");
        // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // frame.add(new JLabel(new ImageIcon(img)));
        // frame.pack();
        // frame.setVisible(true);
    

    public static void main(final String[] args) 
        SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                try 
                    Pdf2Pic.setup();
                 catch (IOException ex) 
                    ex.printStackTrace();
                
            
        );
    

pom.xml依赖配置(将附件中的该jar包上传到nexus内部仓库):

<dependency>
	<groupId>com.sun.pdfview</groupId>
	<artifactId>pdfrenderer</artifactId>
	<version>0.9.0</version>
</dependency>

参考5:Java 将PDF 转为Word、图片、SVG、XPS、Html、PDF/A

来源:Java 将PDF 转为Word、图片、SVG、XPS、Html、PDF/A - 云+社区 - 腾讯云 (tencent.com)

本文将介绍通过Java编程来实现PDF文档转换的方法。包括:

  1. PDF转为Word
  2. PDF转为图片
  3. PDF转为Html
  4. PDF转为SVG 4.1 将PDF每一页转为单个的SVG 4.2 将一个包含多页的PDF文档转为一个SVG
  5. PDF转为XPS
  6. PDF转为PDF/A

使用工具:Free Spire.PDF for Java(免费版)

Jar文件获取及导入:

方法1:通过官网下载下载jar包。下载后,解压文件,并将lib文件夹下的Spire.Pdf.jar文件导入Java程序。

方法2:可通过maven仓库安装导入。参考导入方法

PDF 转Word

PdfDocument pdf = new PdfDocument("test.pdf");
pdf.saveToFile("ToWord.docx",FileFormat.DOCX);

PDF转图片

支持的图片格式包括Jpeg, Jpg, Png, Bmp, Tiff, Gif, EMF等。这里以保存为Png格式为例。

import com.spire.pdf.*;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class PDFtoimage 
    public static void main(String[] args) throws IOException 

PdfDocument pdf = new PdfDocument("test.pdf");
BufferedImage image;
for(int i = 0; i< pdf.getPages().getCount();i++)
    image = pdf.saveAsImage(i);
    File file = new File( String.format("ToImage-img-%d.png", i));
    ImageIO.write(image, "PNG", file);

pdf.close();
    

PDF转Html

PdfDocument pdf = new PdfDocument("test.pdf");
pdf.saveToFile("ToHTML.html", FileFormat.HTML);

PDF转SVG

//转为单个svg
PdfDocument pdf = new PdfDocument("test.pdf");
pdf.saveToFile("ToSVG.svg", FileFormat.SVG);
//多页pdf转为一个svg
PdfDocument pdf = new PdfDocument("sampe.pdf");
pdf.getConvertOptions().setOutputToOneSvg(true);
pdf.saveToFile("ToOneSvg.svg",FileFormat.SVG);

PDF 转XPS

PdfDocument pdf = new PdfDocument("test.pdf");
pdf.saveToFile("ToXPS.xps", FileFormat.XPS);

PDF转PDF/A

import com.spire.pdf.*;
import com.spire.pdf.graphics.PdfMargins;
import java.awt.geom.Dimension2D;

public class PDFtoPDFA 
    public static void main(String[]args)
        //加载测试文档
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("test.pdf");

        //转换为Pdf_A_1_B格式
        PdfNewDocument newDoc = new PdfNewDocument();
        newDoc.setConformance(PdfConformanceLevel.Pdf_A_1_B);
        PdfPageBase page;
        for ( int i=0;i< pdf.getPages().getCount();i++) 
            page = pdf.getPages().get(i);
            Dimension2D size = page.getSize();
            PdfPageBase p = newDoc.getPages().add(size, new PdfMargins(0));
            page.createTemplate().draw(p, 0, 0);
        

        //保存结果文件
        newDoc.save("ToPDFA.pdf");
        newDoc.close();

    

参考6:java实现pdf转图片

来源:java实现pdf转换图片 - pengsn - 博客园 (cnblogs.com)

一、需求

   将PDF文档类转换成图片形式。    
二、实现方式

    2.1 pdfbox     

PDDocument doc = null;
        try 
            doc = PDDocument.load(sourceFile);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) 
                BufferedImage image = renderer.renderImageWithDPI(i, DPI); // 162.8
                ImageIO.write(image, ConvertImageConst.JPG, new File(filepathNoSuffix + File.separator + i + ConvertImageConst.SUFFIX_JPG));
            
            log.info("jpg_ok. space-time: , pageSize= ", (System.currentTimeMillis() - startTime), pageCount);
            return pageCount;
         catch (IOException e) 
            log.error("pdfDocumentRender IOException  ", e);
         catch (Error e) 
            log.error("pdfDocumentRender Error  ", e);
         finally 
            try 
                if (doc != null) 
                    doc.close();
                
             catch (IOException e) 
                log.error("pdfDocumentRender finally IOError ", e.getMessage());
            
            lock.unlock();
        

 2.2 ghostscript 

gswin64 -dSAFER -dBATCH -dNOPAUSE -r300 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=jpeg -sOutputFile=test%03d.jpg  0002.pdf

    命令:

     gswin64 主程序

     -params:

     -sDEVICE=jpeg                 // jpeg格式

     -sOutputFile=test%03d.jpg // 输出的图片名称 %03d 三位数字 %d 一位数字

      0002.pdf  //待转换的pdf文件

三、比较

实现方式优点  缺点
pdfboxmaven引入既可开发转换速度慢,且可能内存溢出 
ghostscript转换速度快依赖ghostscript插件

参考7:java实现pdf转图片

来源:Java实现PDF转图片_hxt的博客-CSDN博客_java pdf转图片

pdfbox转换后清晰度相对来说是比较高的

引入依赖

		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox</artifactId>
			<version>2.0.20</version>
		</dependency>

工具类

public class PdfToImageUtil 
    /**
     * dpi越大转换后越清晰,相对转换速度越慢
     */
    private static final Integer DPI = 100;

    /**
     * 转换后的图片类型
     */
    private static final String IMG_TYPE = "png";

    /**
     * PDF转图片
     *
     * @param fileContent PDF文件的二进制流
     * @return 图片文件的二进制流
     */
    public static List<byte[]> pdfToImage(byte[] fileContent) throws IOException 
        List<byte[]> result = new ArrayList<>();
        try (PDDocument document = PDDocument.load(fileContent)) 
            PDFRenderer renderer = new PDFRenderer(document);
            for (int i = 0; i < document.getNumberOfPages(); ++i) 
                BufferedImage bufferedImage = renderer.renderImageWithDPI(i, DPI);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                ImageIO.write(bufferedImage, IMG_TYPE, out);
                result.add(out.toByteArray());
            
        
        return result;
    

参考8:java pdf转图片

来源:Java PDF转图片 - haxnt - 博客园 (cnblogs.com)

<dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import com.lowagie.text.pdf.PdfReader;
public class test1 

    public static void main(String[] args) 
            pdf2Image("D:/1.pdf", "D:/pdf", 130);
        

        /***
         * PDF文件转PNG图片,全部页数
         *
         * @param PdfFilePath pdf完整路径
         * @param imgFilePath 图片存放的文件夹
         * @param dpi dpi越大转换后越清晰,相对转换速度越慢
         * @return
         */
        public static void pdf2Image(String PdfFilePath, String dstImgFolder, int dpi) 
            File file = new File(PdfFilePath);
            PDDocument pdDocument;
            try 
                String imgPDFPath = file.getParent();
                int dot = file.getName().lastIndexOf('.');
                String imagePDFName = file.getName().substring(0, dot); // 获取图片文件名
                String imgFolderPath = null;
                if (dstImgFolder.equals("")) 
                    imgFolderPath = imgPDFPath + File.separator + imagePDFName;// 获取图片存放的文件夹路径
                 else 
                    imgFolderPath = dstImgFolder + File.separator + imagePDFName;
                

                if (createDirectory(imgFolderPath)) 

                    pdDocument = PDDocument.load(file);
                    PDFRenderer renderer = new PDFRenderer(pdDocument);
                /* dpi越大转换后越清晰,相对转换速度越慢 */
                    PdfReader reader = new PdfReader(PdfFilePath);
                    int pages = reader.getNumberOfPages();
                    StringBuffer imgFilePath = null;
                    for (int i = 0; i < pages; i++) 
                        String imgFilePathPrefix = imgFolderPath + File.separator + imagePDFName;
                        imgFilePath = new StringBuffer();
                        imgFilePath.append(imgFilePathPrefix);
                        imgFilePath.append("_");
                        imgFilePath.append(String.valueOf(i + 1));
                        imgFilePath.append(".png");
                        File dstFile = new File(imgFilePath.toString());
                        BufferedImage image = renderer.renderImageWithDPI(i, dpi);
                        ImageIO.write(image, "png", dstFile);
                    
                    System.out.println("PDF文档转PNG图片成功!");

                 else 
                    System.out.println("PDF文档转PNG图片失败:" + "创建" + imgFolderPath + "失败");
                

             catch (IOException e) 
                e.printStackTrace();
            
        

        private static boolean createDirectory(String folder) 
            File dir = new File(folder);
            if (dir.exists()) 
                return true;
             else 
                return dir.mkdirs();
            
        


以上是关于java做 pdf转换成图片 时出现Unknown CMap: UniGB-UCS2-H?急~的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Java 中生成非常大的 PDF 文件时出现 ***Error

pdf转换成PPt时出现乱码,比如说就是那些希腊字母显示不出来等,该怎么办?

mssql在JDBC通用更新时出现 不支持从 UNKNOWN 到 UNKNOWN 的转换。

java 实现pdf转换成图片

icepdf将PDF电子发票转换成PNG图片出现金额错行(java)?

Java程序运行时出现Unknown Source,该怎么解决啊?