使用java对pdf文档进行分解和合成

知识点:对输入流,输出流的应用
 

package yichanglei4;
import java.io.*;
import java.util.Arrays;

public class str {
	public static void main(String[] args) {
 		// TODO Auto-generated method stub
//分解
		File f1=new File("D:\\pdf","李航.统计学习方法.pdf");//确定要分解的文档
		 long L1;
		 int num=0,i=0,n=0;
		int zijie=1024*1024*5;//分解成5M大小的pdf文档
		L1=f1.length();
		 byte[]a = new byte[(int)L1];
		 byte[]b;
		 if
		 	(L1%zijie==0)num=(int)L1/zijie;//判断可以分解为几个5M大小的文档
		 else
			 num=(int)L1/zijie+1;//不足加一
		 try{
        	 FileInputStream in=new FileInputStream(f1);//该语句可能会出现错误,                                           
        	 in.read(a);    //对目标文件进行读入         //所以应在try语句中
        	 in.close();
		 for(i=0;i<num;i++)
		 {
			 String name=i+1+"-"+"李航.统计学习方法.pdf";
			 if(i!=num-1)
				 {
				 b=new byte[zijie];     //对输出字节数组大小进行定义            
				 b=Arrays.copyOfRange(a,i*zijie,(i+1)*zijie);//复制数组a中该字节数组
				 }                                           //大小的值
			 else
			 {
				 b=new byte[(int)(L1-(i-1)*zijie)];
				 b=Arrays.copyOfRange(a,i*zijie,(int)L1);
			 }
	        	 File f2=new File("D:\\splitpdf",name);
	        	 FileOutputStream  out=new  FileOutputStream(f2);//定义输出流
	        	  out.write(b);                //进行字节数组输出
	        	  out.close();
	         }
		 }
		 catch(IOException e1){
			 System.out.println(e1);
		 }
//合成
		 File f3=new File("D:\\splitpdf");
		 File []splitfile=f3.listFiles();         //该方法返回在f3文件夹下的文件
		 File f4=new File("D:\\splitpdf","new李航.统计学习方法.pdf");
		 int t=0;
		 int sumlength=0;
		 for(File f5:splitfile)
		 {
			 System.out.println(f5.getName());
			 System.out.println((int)f5.length());
			 sumlength+=(int)f5.length();
		 }
			 try {
				 FileOutputStream  sumout=new  FileOutputStream(f4);
				 for(File f5:splitfile) {       //遍历每一个被分解的文档
					 byte d[]=new byte[(int)f5.length()];
			 FileInputStream sumin=new FileInputStream(f5);
			 sumin.read(d);       //读入
			 sumout.write(d);     //写入
			 sumin.close();
			 }
				 sumout.close();
			 }
			 catch(Exception e2)
			 {
				 System.out.println(e2);
			 }
			 
	         }}

结果:

 

对于合成的步骤:

我个人的方法(虽然可以进行文档的和成但是无法对文档重新打开)不同于上面的方法

附上个人代码(虽然和上面大致思路相同)

我的合成过程是分解过程的逆过程

(找到了问题所在,但不知道为什么f4的创建会有大小)

package yichanglei4;
import java.io.*;
import java.util.Arrays;

public class str {
	public static void main(String[] args) {
 		// TODO Auto-generated method stub
//分解
		File f1=new File("D:\\pdf","李航.统计学习方法.pdf");
		 long L1;
		 int num=0,i=0,n=0;
		int zijie=1024*1024*5;
		L1=f1.length();
		 byte[]a = new byte[(int)L1];;
		 byte[]b;
		 if
		 	(L1%zijie==0)num=(int)L1/zijie;
		 else
			 num=(int)L1/zijie+1;
		 try{
        	 FileInputStream in=new FileInputStream(f1);
        	 in.read(a);
        	 in.close();
		 for(i=0;i<num;i++)
		 {
			 String name=i+1+"-"+"李航.统计学习方法.pdf";
			 if(i!=num-1)
				 {
				 b=new byte[zijie];
				 b=Arrays.copyOfRange(a,i*zijie,(i+1)*zijie);
				 }
			 else
			 {
				 b=new byte[(int)(L1-(i-1)*zijie)];
				 b=Arrays.copyOfRange(a,i*zijie,(int)L1);
			 }
	        	 File f2=new File("D:\\splitpdf",name);
	        	 FileOutputStream  out=new  FileOutputStream(f2);
	        	  out.write(b);
	        	  out.close();
	         }
		 }
		 catch(IOException e1){
			 System.out.println(e1);
		 }
//合成 
		 File f3=new File("D:\\splitpdf");
		 File []splitfile=f3.listFiles();
		 File f4=new File("D:\\splitpdf","new李航.统计学习方法.pdf");
		 int t=0;
		 for(File f5:splitfile)     //问题在于遍历每个f5的大小(注意f4为什么会有大小)
		 {
			 byte c[] = new byte[(int)f5.length()];
			 byte d[]=new byte[(int)L1];   //数组大小不够
			 try {
			 FileInputStream sumin=new FileInputStream(f5);
			 sumin.read(c);
			 sumin.close();
			 }
			 catch(Exception e2)
			 {
				 System.out.println(e2);
			 }
			 int L2=0;
			 System.arraycopy(c, 0, d, L2, (int)f5.length());
			 L2+=(int)f5.length();
			 try {
				 FileOutputStream  sumout=new  FileOutputStream(f4);
				 sumout.write(d);
				 sumout.close();
				 }
				 catch(Exception e3)
				 {
					 System.out.println(e3);
				 }
		 }
		
	         }}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值