java实现Img与PDF相互转换

本文实例为大家分享了java实现Img与PDF相互转换的具体代码,供大家参考,具体内容如下

不善于表达,就直接贴出代码吧。请大牛忽视我。

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap; 

import com.Utils.ImgFileTool;
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage; 

/**
 *
 * @author hubiao
 * @dateTime 2014-06-07
 *   本工具对实现对IMG与PDF相互转换。
 *   运行测试需要导入以下2个jar包
 *     itext-2.0.2.jar
 *     PDFRenderer.jar
 *
 */
@SuppressWarnings("unused")
public class ImgPdfUtils {
  public static void main(String[] args) throws Exception {
    //PDF包提取 pdf
    //pdfExtraction(); 

    //pdf转jpg
    //pdfToJpg("E:\\java\\资料pdf\\1.pdf","E:\\java\\资料pdf\\1.jpg",1); 

    //将多个jpg直接合并成pdf包
    //extractionPdf("F:\\temp\\Project\\数据\\dfdsfds\\巴黎公社活动家传略_img","F:\\temp\\Project\\数据\\dfdsfds\\巴黎公社活动家传略_img.pdf"); 

    //jpg转pdf
    //jpgToPdf(); 

    //文件排序
    //listOrder(); 

    ImgFileTool.imgMerageToPdf(new File("F:\\temp\\Project\\数据\\dfdsfds\\巴黎公社活动家传略_img").listFiles(),new File("F:\\temp\\Project\\数据\\dfdsfds\\","巴黎公社活动家传略.pdf"));
  } 

  private static void listOrder() { 

    File[] listFiles = new File("F:\\temp\\Project\\数据\\dfdsfds\\巴黎公社活动家传略_img").listFiles();
    TreeMap<Integer, File> tree = new TreeMap<Integer, File>();
    for(File f : listFiles)
    {
      tree.put(Integer.parseInt(f.getName().replaceAll(".jpg$", "")), f);
    }
    for(Entry<Integer, File> eif : tree.entrySet())
    {
      System.out.println(eif.getKey()+"="+eif.getValue().toString());
    }
  }
  /**
   * @param list 图片集合
   * @param file 保存路径
   * @return true,合并完成
   *   如果文件名不是1.jpg,2.jpg,3.jpg,4.jpg这样的。则需要自己重写TreeMap的排序方式!
   */
  public static boolean imgMerageToPdf(File[] list, File file)throws Exception {
    //1:对图片文件通过TreeMap以名称进行自然排序
    Map<Integer,File> mif = new TreeMap<Integer,File>();
    for(File f : list)
      mif.put(Integer.parseInt(f.getName().replaceAll(".jpg$", "")), f); 

    //2:获取第一个Img的宽、高做为PDF文档标准
    ByteArrayOutputStream baos = new ByteArrayOutputStream(2048*3);
    InputStream is = new FileInputStream(mif.get(1));
    for(int len;(len=is.read())!=-1;)
      baos.write(len); 

    baos.flush();
    Image image = Image.getInstance(baos.toByteArray());
    float width = image.width();
    float height = image.height();
    baos.close(); 

    //3:通过宽高 ,实例化PDF文档对象。
    Document document = new Document(new Rectangle(width,height));
    PdfWriter pdfWr = PdfWriter.getInstance(document, new FileOutputStream(file));
    document.open(); 

    //4:获取每一个图片文件,转为IMG对象。装载到Document对象中
    for(Entry<Integer,File> eif : mif.entrySet())
    {
      //4.1:读取到内存中
      baos = new ByteArrayOutputStream(2048*3);
      is = new FileInputStream(eif.getValue());
      for(int len;(len=is.read())!=-1;)
        baos.write(len);
      baos.flush(); 

      //4.2通过byte字节生成IMG对象
      image = Image.getInstance(baos.toByteArray());
      Image.getInstance(baos.toByteArray());
      image.setAbsolutePosition(0.0f, 0.0f); 

      //4.3:添加到document中
      document.add(image);
      document.newPage();
      baos.close();
    } 

    //5:释放资源
    document.close();
    pdfWr.close(); 

    return true;
  }
  /**
   *
   * @param source 源文件
   * @param target 目标文件
   * @param x 读取源文件中的第几页
   */
  private static void pdfToJpg(String source,String target,int x) throws Exception {
    //创建从中读取和向其中写入(可选)的随机访问文件流,R表示对其只是访问模式
    RandomAccessFile rea = new RandomAccessFile(new File(source), "r"); 

    //将流读取到内存中,然后还映射一个PDF对象
    FileChannel channel = rea.getChannel();
    ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY,0, channel.size());
    PDFFile pdfFile = new PDFFile(buf);
    PDFPage page = pdfFile.getPage(x);  

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

    // generate the image
    java.awt.Image img = page.getImage(rect.width, rect.height, // width &
        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(target); // 输出到文件流
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode(tag); // JPEG编码
    out.close();
  }
  /**
   * @param source 源PDF文件路径
   * @param target 保存PDF文件路径
   * @param pageNum 提取PDF中第pageNum页
   * @throws Exception
   */
  private static void pdfExtraction(String source,String target,int pageNum) throws Exception{
    //1:创建PDF读取对象
    PdfReader pr = new PdfReader(source);
    System.out.println("this document "+pr.getNumberOfPages()+" page"); 

    //2:将第page页转为提取,创建document对象
    Document doc = new Document(pr.getPageSize(pageNum)); 

    //3:通过PdfCopy转其单独存储
    PdfCopy copy = new PdfCopy(doc, new FileOutputStream(new File(target)));
    doc.open();
    doc.newPage(); 

    //4:获取第1页,装载到document中。
    PdfImportedPage page = copy.getImportedPage(pr,pageNum);
    copy.addPage(page);  

    //5:释放资源
    copy.close();
    doc.close();
    pr.close();
  }
  /**
   * @param pdfFile 源PDF文件
   * @param imgFile  图片文件
   */
  private static void jpgToPdf(File pdfFile,File imgFile) throws Exception {
    //文件转img
    InputStream is = new FileInputStream(pdfFile);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    for(int i;(i=is.read())!=-1;)
    {
      baos.write(i);
    }
    baos.flush(); 

    //取得图像的宽和高。
    Image img = Image.getInstance(baos.toByteArray());
    float width = img.width();
    float height = img.height();
    img.setAbsolutePosition(0.0F, 0.0F);//取消偏移
    System.out.println("width = "+width+"\theight"+height); 

    //img转pdf
    Document doc = new Document(new Rectangle(width,height));
    PdfWriter pw = PdfWriter.getInstance(doc,new FileOutputStream(imgFile));
    doc.open();
    doc.add(img); 

    //释放资源
    System.out.println(doc.newPage());
    pw.flush();
    baos.close();
    doc.close();
    pw.close();
  } 

} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • java中pdf转图片的实现方法
  • java如何将pdf转换成image
(0)

相关推荐

  • java如何将pdf转换成image

    本文实例为大家分享了java将pdf转换image的具体代码,供大家参考,具体内容如下 首先使用了使用了apache的PDFBox组件1.8.4版本 package pdf; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import javax.imageio.ImageIO;

  • java中pdf转图片的实现方法

    JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用. 一.icepdf.有收费版和开源版,几种方法里最推荐的.转换的效果比较好,能识别我手头文件中的中文,就是转换后可能字体的关系部分字间距有点宽.因为,字体支持是要收费的,所以转换的图片会带有官方的水印.去水印的方法可以查看另一篇文章:icepdf去水印方法 1.下载icepdf的架包,并导入项目中,这里用到4个,如下: 2.附上代码例子: String filePath = "c:/test.pdf

  • java实现Img与PDF相互转换

    本文实例为大家分享了java实现Img与PDF相互转换的具体代码,供大家参考,具体内容如下 不善于表达,就直接贴出代码吧.请大牛忽视我. import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.Input

  • Java实现Html转Pdf的方法

    本文实例讲述了Java实现Html转Pdf的方法.分享给大家供大家参考.具体如下: package test; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import org.xhtmlrenderer.pdf.ITextFontResolver; import org.xhtmlrenderer.pdf.ITextRenderer; import com.lowagie.

  • java实现PPT转PDF出现中文乱码问题的解决方法

    ppt转成pdf,原理是ppt转成图片,再用图片生产pdf,过程有个问题,不管是ppt还是pptx,都遇到中文乱码,编程方框的问题,其中ppt后缀网上随便找就有解决方案,就是设置字体为统一字体,pptx如果页面是一种中文字体不会有问题,如果一个页面有微软雅黑和宋体,就会导致部分中文方框,怀疑是poi处理的时候,只读取第一种字体,所以导致多个中文字体乱码. 百度和谷歌都找了很久,有看到说apache官网有人说是bug,但他们回复说是字体问题,这个问题其实我觉得poi可能可以自己做,读取原来字体设置

  • java中unicode和中文相互转换的简单实现

    如下所示: package test.com.gjob.services; import java.util.Properties; public class Test { public static void main(String[] args) { String s = "简介"; String tt = gbEncoding(s); // String tt1 = "你好,我想给你说一个事情"; System.out.println(decodeUnicod

  • java使用itext导出PDF文本绝对定位(实现方法)

    jar:itext-4.2.1.jar 在很多公文的落款处都需要绝对定位,所以记录此代码如下: PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf")); PdfContentByte cb = writer.getDirectContent(); BaseFont bf= BaseFont.createFont("STSong-Light", "

  • Java中List与数组相互转换实例分析

    本文实例分析了Java中List与数组相互转换的方法.分享给大家供大家参考.具体如下: 今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本.如下: ArrayList<String> list=new ArrayList<String>(); String strings[]=(String [])list.toArray(); 这样写代码个人觉得应该没什么问题,编译也没有问题.可是具体运行的时候报异常,如下:Exception in thread "mai

  • Java使用icepdf将pdf文件按页转成图片

    本文实例为大家分享了Java使用icepdf将pdf文件按页转成图片的具体代码,供大家参考,具体内容如下 Maven icepdf包,这里过滤掉jai-core <dependency> <groupId>org.icepdf.os</groupId> <artifactId>icepdf-core</artifactId> <version>6.1.2</version> <exclusions> <e

  • Java日期时间及日期相互转换实现代码

    这篇文章主要介绍了Java日期时间及日期相互转换实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java.util 包提供了 Date 类来封装当前的日期和时间. Date 类提供两个构造函数来实例化 Date 对象. 第一个构造函数使用当前日期和时间来初始化对象. Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; import java.text.ParseException

  • Java 添加和删除PDF图层的示例代码

    在PDF文档中,图层可以使部分内容选择性地被隐藏或显示.通过添加图层,我们可以将文本.图片.表格等元素精确定位于页面指定位置,并可将这些元素进行叠放.组合形成页面的最终效果.本文将介绍如何使用Spire.PDF for Java来添加和删除PDF图层. 使用工具: Free Spire.PDF for Java (免费版) Jar文件获取及导入: 方法1:通过官方网站 下载获取jar包.解压后将lib文件夹下的Spire.Pdf.jar文件导入Java程序.(如下图) 方法2:通过maven仓库

  • Java实现图片转换PDF文件的示例代码

    最近因为一些事情,需要将一张简单的图片转换为PDF的文件格式,在网上找了一些工具,但是这些工具不是需要注册账号,就是需要下载软件. 而对于只是转换一张图片的情况下,这些操作显然是非常繁琐的,所以作者就直接使用Java写了一个图片转换PDF的系统,现在将该系统分享在这里. 引入依赖 <!--该项目以SpringBoot为基础搭建--> <parent> <groupId>org.springframework.boot</groupId> <artifa

随机推荐