精华内容
下载资源
问答
  • Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换。 我们可以使用PDFBox开发可以创建,转换和操作PDF文档的Java程序。PDFBox的主要功能: Extract Text – 使用PDFBox,您可以从PDF文件中提取Unicode文本。 ...
  • 本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法。分别调用方法extractText()和extractImages()来读取,需要的朋友可以参考下
  • pdfbox 提取 pdf图片文件以及读取pdf的文本信息,压缩包中包含必备jar包
  • java解析pdf格式文件获取文本内容

    千次阅读 2019-11-05 18:34:10
    思路:先将pdf按照页数分割成图片,在将分割的图片图片识别,提取文字,最后将提取到的文字解析或者保存到txt文件。 图片识别我使用的是百度开发者中心提供的图片识别接口,我在上一篇文章中有详细说明,这里直接...

    思路:先将pdf按照页数分割成图片,在将分割的图片做图片识别,提取文字,最后将提取到的文字解析或者保存到txt文件。

    图片识别我使用的是百度开发者中心提供的 图片识别接口,我在上一篇文章中有详细说明,这里直接跳过,文本只调用的百度开发者中的通用文字接口,对于pdf中的表格,图像,印章 无法做到识别;但是在百度开发者中心已经提供了相关接口,可自行参考接口说明,百度开发中心的相关使用和介绍也上上一篇博客中。

    链接:https://blog.csdn.net/qq_30515213/article/details/102897601

    我是maven项目,目录结构如下(除了PdfResolveService.java ,其他几个文件均在我上一篇文章中,源码也可以在上一篇可以下载):

    pom.xml内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.wsk</groupId>
        <artifactId>baidu</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.46</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.5</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.12</version>
            </dependency>
           <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
            <dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>pdfbox</artifactId>
                <version>2.0.17</version>
            </dependency>
        </dependencies>
    
        <build>
            <finalName>ROOT</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

    pfd服务类:PdfResolveService.java

    package com.baidu.api;
    
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.net.URISyntaxException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import javax.imageio.ImageIO;
    
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
    import org.apache.pdfbox.rendering.ImageType;
    import org.apache.pdfbox.rendering.PDFRenderer;
    
    import com.alibaba.fastjson.JSONObject;
    
    
    
    public class PdfResolveService {
    	public static void main(String[] args) {
    		pdfToImage("d:/home/pdf/通知.pdf","d:/home/image/20180125/");
    	}
    	/** 
         * 把pdf文件按页数分割,并调用生成图片方法
         *  
         * @param pdfUrl 
         *            文件流数组 
         * @param imageUrl 
         *            输出路径
         * @return  imageNames
         * 			  解析图片文件名称集合
         */  
    	public static List<String> pdfToImage(String pdfUrl , String imageUrl){
    		long start = System.currentTimeMillis();
    		String fileName = pdfUrl.substring(pdfUrl.lastIndexOf("/")+1, pdfUrl.length());
    		fileName = fileName.substring(0,fileName.lastIndexOf("."));
            //String filepath = "E:/长安1号-提取指令1份20180104.pdf";  
            PDDocument document = new PDDocument();  
            File pdfFile = new File(pdfUrl);
            List<String> imageNames = new ArrayList<String>();
            if(pdfFile.exists()){
    	        try {
    				document = PDDocument.load(pdfFile, (String)null);
    		        int size = document.getNumberOfPages();  
    		        List<BufferedImage> piclist = new ArrayList();   
    		        for(int i=0 ; i < size; i++){  
    		            BufferedImage  image = new PDFRenderer(document).renderImageWithDPI(i,300,ImageType.RGB);  
    		            piclist.add(image);  
    		        }  
    		        document.close();
    		        isFileExist(imageUrl); //判断文件夹是否存在
    		        imageNames = yPicTxtByPage(piclist,imageUrl,fileName); //生成图片和txt到路劲下
    	        } catch (InvalidPasswordException e) {
    				// TODO 自动生成的 catch 块
    				e.printStackTrace();
    			} catch (IOException e) {
    				// TODO 自动生成的 catch 块
    				e.printStackTrace();
    			}
    	        long end = System.currentTimeMillis();  
    	        System.out.println(end-start);
            }
            return imageNames;
    	}
    	/** 
         * 把pdf文件按页数生成多个png图片 
         *  
         * @param piclist 
         *            文件流数组 
         * @param outPath 
         *            输出路径
         * @param fileName 
         *            解析文件名称
         * @return  imageNames
         * 			  解析图片文件名称集合 
         */  
        public static List<String> yPicTxtByPage(List<BufferedImage> piclist, String outPath, String fileName) {// 纵向处理图片  
            if (piclist == null || piclist.size() <= 0) {  
                System.out.println("图片数组为空!");  
                return null;  
            }  
            List<String> imageNames = new ArrayList<String>();
            try {  
                int height = 0, // 总高度  
                width = 0, // 总宽度  
                picNum = piclist.size();// 图片的数量  
                BufferedImage buffer = null; // 保存图片流  
                int[] _imgRGB; // 保存一张图片中的RGB数据
                List<int[]> imgRGB = new ArrayList<int[]>(); // 保存所有的图片的RGB
                String imageName = "";
                for (int i = 0; i < picNum; i++) {  
                	buffer = piclist.get(i);
                	height = buffer.getHeight();// 图片高度
                	width = buffer.getWidth();// 图片宽度
                	// 生成新图片  
                	BufferedImage imageResult = new BufferedImage(width, height,  
                			BufferedImage.TYPE_INT_BGR); 
                	_imgRGB = new int[width * height];// 从图片中读取RGB
                	_imgRGB = buffer  
                            .getRGB(0, 0, width, height, _imgRGB, 0, width);
                	imgRGB.add(_imgRGB); 
                    imageResult.setRGB(0, 0, width, height,imgRGB.get(i),  
                            0, width); // 写入流中 
                    imageName = fileName+i;
                    File outFile = new File(outPath+fileName+i+".png");  
                    ByteArrayOutputStream out = new ByteArrayOutputStream();  
                    ImageIO.write(imageResult, "png", out);// 写图片  
                    byte[] b = out.toByteArray();  
                    FileOutputStream output = new FileOutputStream(outFile);  
                    output.write(b);
                    pngToTxt(outPath+fileName+i+".png",outPath+fileName+i+".txt");
                    out.close();  
                    output.close();
                    imageNames.add(imageName);
                }  
                return imageNames;
            } catch (Exception e) {  
                e.printStackTrace();  
            }
    		return imageNames; 
        }
        /** 
         * 把png图片生成txt文本返回到指定目录 
         *  
         * @param imageUrl 
         *            图片路劲 
         * @return  txtUrl
         * 			  解析生成txt路劲(utf-8)格式
         */ 
    	public static void pngToTxt(String imageUrl,String txtUrl){
    		//File imageFile = new File("e:/PDFBox1.png");
    		File imageFile = new File(imageUrl);
        	//判断文件是否存在
        	if(imageFile.exists()){
        		try {
        			//String path = "D:\\home\\image\\20180125\\0.png";
        			String result = "";
        	        try {
        	            long now = System.currentTimeMillis();
        	            String str =  MyImgCheck.checkFile(imageUrl);//调用图片解析文字服务
        	            //根据需要解析组装返回的数据
                        Map<String,Object> mapObj = JSONObject.parseObject(str,Map.class);  
                        List<Map<String,Object>>words_result=(List<Map<String,Object>>)mapObj.get("words_result");
                        for(int i=0;i<words_result.size();i++){
                        	System.out.println("第"+i+"行:"+words_result.get(i).get("words"));
                        }
        	            System.out.println("耗时:" + (System.currentTimeMillis() - now) / 1000 + "s");
        	            result=str;
        	        } catch (URISyntaxException | IOException e) {
        	            e.printStackTrace();
        	        }
        			
        			System.out.println(result);
        			OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(txtUrl),"UTF-8");
        			osw.write(result);            
        			osw.flush();            
        			osw.close();
        		} catch (Exception e) {
        			System.err.println(e.getMessage());
        		}
        	}
    	}
    	/** 
         *  判断路劲是否存在,不存在则创建
         *  
         * @param strPath 
         *            文件夹路劲 
         * @return boolean 
         *            是否存在 
         */
        public static boolean isFileExist(String strPath){
        	File file = new File(strPath);
        	if(file.exists()){
        		return true;
        	}else{
        		file.mkdirs();
        		return false;
        	}
        }
    }
    

    运行结果:

    解析的文字:

    生成的图片和保存的txt:

     

     

    展开全文
  • 前段时间,为了解析PDF,花了不少时间去学习PDFbox和itext,这两个都是处理PDF的开源库,有java和C#的。作为一个刚开始学习这两个开源库的,感觉百度上的资源还是太少了。我做的是一个关于PDF的处理,在百度上找了...

    前段时间,为了解析PDF,花了不少时间去学习PDFbox和itext,这两个都是处理PDF的开源库,有java和C#的。作为一个刚开始学习这两个开源库的,感觉百度上的资源还是太少了。我做的是一个关于PDF的处理,在百度上找了半天都没找到答案,最后去itext的官网和Stack Overflow上找到了答案。最后比较了一下,pdfbox和itext相对而言,itext的功能要强不少,本人对比过itext和pdfbox处理pdf 文件时候的速度itext要快一些,而且itext官网给出的例子和一些问题(这些问题都是从Stack Overflow上面的问题),所以我最后选择了itext,itext5例子这个链接是itext5官方的例子,非常需要注意的一个地方就是,不同版本的itext对于解决同一个问题的代码可以不同,个人觉得itext7相对于itext5的改变挺大的。下面我的一些例子都是itext5.5.11版本的,这个链接可以下载itext5.5.11的jar包itext5.5.11 jar下载itext dll这个链接可以下载itext5.5.11的dll包。其实java和c#在使用itext的时候都是一样的。下面我会,给出几个关于PDF操作的一些例子。都是一些处理PDF的例子,对于如何去制作一个PDF文件可以去itext官网找资料。在itext中处理PDF文件都是以字典对象进行封装的,这个和PDF的结构是一样的,可以去参考PDF reference

    一、导出PDF中的子图片

    public static void extractImage(String filename){
    		
    		PdfReader reader = null;
    		try {
    			//读取pdf文件
    			reader = new PdfReader(filename);
    			//获得pdf文件的页数
    			int sumPage = reader.getNumberOfPages();	
    			//读取pdf文件中的每一页
    			for(int i = 1;i <= sumPage;i++){
    				//得到pdf每一页的字典对象
    				PdfDictionary dictionary = reader.getPageN(i);
    				//通过RESOURCES得到对应的字典对象
    				PdfDictionary res = (PdfDictionary) PdfReader.getPdfObject(dictionary.get(PdfName.RESOURCES));
    				//得到XOBJECT图片对象
    				PdfDictionary xobj = (PdfDictionary) PdfReader.getPdfObject(res.get(PdfName.XOBJECT));
    				if(xobj != null){
    					for(Iterator it = xobj.getKeys().iterator();it.hasNext();){
    						PdfObject obj = xobj.get((PdfName)it.next());			
    						if(obj.isIndirect()){
    							PdfDictionary tg = (PdfDictionary) PdfReader.getPdfObject(obj);					
    							PdfName type = (PdfName) PdfReader.getPdfObject(tg.get(PdfName.SUBTYPE));
    							if(PdfName.IMAGE.equals(type)){		
    								PdfObject object =  reader.getPdfObject(obj);
    								if(object.isStream()){						
    									PRStream prstream = (PRStream)object;
    									byte[] b;
    									try{
    										b = reader.getStreamBytes(prstream);
    									}catch(UnsupportedPdfException e){
    										b = reader.getStreamBytesRaw(prstream);
    									}
    									FileOutputStream output = new FileOutputStream(String.format("d:/pdf/output%d.jpg",i));
    									output.write(b);
    									output.flush();
    									output.close();								
    								}
    							}
    						}
    					}
    				}
    			}
    			
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}

    这个例子是我在百度上搜到的,但是并不完整,这个是导出PDF中的图片,我将他补充完整了。这个程序有问题,可以对于某些PDF文件导出的图片无法打开。

    二、去除PDF文件的水印字体

    /**
     * <a href="http://stackoverflow.com/questions/35526822/removing-watermark-from-pdf-itextsharp">
     * Removing Watermark from PDF iTextSharp
     * </a>
     * <p>
     * This class presents a simple content stream editing framework. As is it creates an equivalent
     * copy of the original page content stream. To actually edit, simply overwrite the method
     * {@link #write(PdfContentStreamProcessor, PdfLiteral, List)} to not (as in this class) write
     * the given operations as they are but change them in some fancy way.
     * </p>
     * 
     * @author mkl
     */
    public class PdfContentStreamEditor extends PdfContentStreamProcessor
    {
    	
    	public static void main(String[] args) {
    		try {
    			PdfReader reader = new PdfReader("input.pdf");
    			OutputStream result = new FileOutputStream(new File("out.pdf"));
    			PdfStamper pdfStamper = new PdfStamper(reader, result);
    			PdfContentStreamEditor identityEditor = new PdfContentStreamEditor();
    			for(int i = 1;i <= reader.getNumberOfPages();i++){
    				identityEditor.editPage(pdfStamper, i);
    			}
    			pdfStamper.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (DocumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
        /**
         * This method edits the immediate contents of a page, i.e. its content stream.
         * It explicitly does not descent into form xobjects, patterns, or annotations.
         */
        public void editPage(PdfStamper pdfStamper, int pageNum) throws IOException
        {
            PdfReader pdfReader = pdfStamper.getReader();
            PdfDictionary page = pdfReader.getPageN(pageNum);
            byte[] pageContentInput = ContentByteUtils.getContentBytesForPage(pdfReader, pageNum);
            page.remove(PdfName.CONTENTS);
            editContent(pageContentInput, page.getAsDict(PdfName.RESOURCES), pdfStamper.getUnderContent(pageNum));
        }
        
        /**
         * This method processes the content bytes and outputs to the given canvas.
         * It explicitly does not descent into form xobjects, patterns, or annotations.
         */
        public void editContent(byte[] contentBytes, PdfDictionary resources, PdfContentByte canvas)
        {
            this.canvas = canvas;
            processContent(contentBytes, resources);
            this.canvas = null;
        }
        
        /**
         * <p>
         * This method writes content stream operations to the target canvas. The default
         * implementation writes them as they come, so it essentially generates identical
         * copies of the original instructions the {@link ContentOperatorWrapper} instances
         * forward to it.
         * </p>
         * <p>
         * Override this method to achieve some fancy editing effect.
         * </p> 
         */
        protected void write(PdfContentStreamProcessor processor, PdfLiteral operator, List<PdfObject> operands) throws IOException
        {
            int index = 0;
    
            for (PdfObject object : operands)
            {
                object.toPdf(canvas.getPdfWriter(), canvas.getInternalBuffer());
                canvas.getInternalBuffer().append(operands.size() > ++index ? (byte) ' ' : (byte) '\n');
            }
        }
    
        //
        // constructor giving the parent a dummy listener to talk to 
        //
        public PdfContentStreamEditor()
        {
            super(new DummyRenderListener());
        }
    
        //
        // Overrides of PdfContentStreamProcessor methods
        //
        @Override
        public ContentOperator registerContentOperator(String operatorString, ContentOperator operator)
        {
            ContentOperatorWrapper wrapper = new ContentOperatorWrapper();
            wrapper.setOriginalOperator(operator);
            ContentOperator formerOperator = super.registerContentOperator(operatorString, wrapper);
            return formerOperator instanceof ContentOperatorWrapper ? ((ContentOperatorWrapper)formerOperator).getOriginalOperator() : formerOperator;
        }
    
        @Override
        public void processContent(byte[] contentBytes, PdfDictionary resources)
        {
            this.resources = resources; 
            super.processContent(contentBytes, resources);
            this.resources = null;
        }
    
        //
        // members holding the output canvas and the resources
        //
        protected PdfContentByte canvas = null;
        protected PdfDictionary resources = null;
        
        //
        // A content operator class to wrap all content operators to forward the invocation to the editor
        //
        class ContentOperatorWrapper implements ContentOperator
        {
            public ContentOperator getOriginalOperator()
            {
                return originalOperator;
            }
    
            public void setOriginalOperator(ContentOperator originalOperator)
            {
                this.originalOperator = originalOperator;
            }
    
            @Override
            public void invoke(PdfContentStreamProcessor processor, PdfLiteral operator, ArrayList<PdfObject> operands) throws Exception
            {
                if (originalOperator != null && !"Do".equals(operator.toString()))
                {
                    originalOperator.invoke(processor, operator, operands);
                }
                write(processor, operator, operands);
            }
            
            private ContentOperator originalOperator = null;
        }
    
        //
        // A dummy render listener to give to the underlying content stream processor to feed events to
        //
        static class DummyRenderListener implements RenderListener
        {
            @Override
            public void beginTextBlock() { }
    
            @Override
            public void renderText(TextRenderInfo renderInfo) { }
    
            @Override
            public void endTextBlock() { }
    
            @Override
            public void renderImage(ImageRenderInfo renderInfo) { }
        }
    }
    上面这个类是官方给出的一个工具类

    public static void main(String[] args) {
    		try {
    			PdfReader pdfReader = new PdfReader("d:/1.pdf");
    			FileOutputStream os = new FileOutputStream("d:/reader.pdf");
    			PdfStamper stamper = new PdfStamper(pdfReader,os);
    			PdfContentStreamEditor editor = new PdfContentStreamEditor(){				
    				@Override
    				protected void write(PdfContentStreamProcessor processor, PdfLiteral operator, List<PdfObject> operands)
    						throws IOException {
    					String operatorString = operator.toString();
    					//Tj 操作通过当前的字体和其他文字相关的图形状态参数来取走一串操作和绘制相应的字形
    					//Tr操作设置的文本渲染模式
    					//一个文本对象开始于BT,结束于ET
    					final List<String> TEXT_SHOWING_OPERATORS = Arrays.asList("Tj","'","\\","TJ");
    					System.out.println(operatorString);
    					if(TEXT_SHOWING_OPERATORS.contains(operatorString)){
    						PdfDictionary dic = gs().getFont().getFontDictionary();						
    						if(gs().getFont().getPostscriptFontName().endsWith("BoldMT")){//BoldMT字体的名称
    							return;
    						}
    					}
    					super.write(processor, operator, operands);
    				}
    			};
    			for(int i = 1;i <= pdfReader.getNumberOfPages();i++){
    				editor.editPage(stamper, i);
    			}
    			stamper.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (DocumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}

    用itext处理PDF文件的时候RenderListener非常有用,他是itext里面的一个接口,你可以建立一个类去实现它,然后重新它的方法,可以在里面写处理PDF文件具体功能。这个接口,提供了处理文字和图片的方法需要你重写。我是在Stack Overflow上面找到的,真的就像那个说的一样,就是万能的。

    展开全文
  • java解析pdf

    添加spire.pdf依赖,依赖需要下载到本地仓库

    <repositories>
        <repository>
            <id>com.e-iceblue</id>
            <name>e-iceblue</name>
            <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
        </repository>
    </repositories>
    
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>2.2.0</version>
    </dependency>
    public static void main(String[] args) {
        try {
            PdfDocument doc = new PdfDocument();
            doc.loadFromFile("C:\\TTT\\test\\day01.pdf");
            StringBuilder sb = new StringBuilder();
            PdfPageBase page;
            for (int i = 0; i < doc.getPages().getCount(); i++) {
                //获取每一行的page对象
                page = doc.getPages().get(i);
                sb.append(page.extractText(true));
                // 这个if中是图片的解析输出
                if (page.extractImages() != null) {
                    for (BufferedImage image : page.extractImages()) {
                        if (image != null) {
                            //指定输出图片名,指定图片格式,后缀自己换
                            File output = new File("C:\\TTT\\test\\copy\\a.png");
                            ImageIO.write(image, "PNG", output);
                        }
                    }
                }
            }
            System.out.println(sb);
            doc.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    展开全文
  • java读取pdf文件的图片文字内容

    万次阅读 2017-11-02 14:37:43
    引用的jar包: pdfbox-1.8.13.jar fontbox-1.8.13.jar   public static void main(String[] args) { PDFReader pdfReader1 = new PDFReader(); pdfReader1.pdfReader("C:/Users/Administrator/D...

    引用的jar包:

    pdfbox-1.8.13.jar

    fontbox-1.8.13.jar

     

        public static void main(String[] args) {
            PDFReader pdfReader1 = new PDFReader();
            pdfReader1.pdfReader("C:/Users/Administrator/Desktop/2017_PDF.pdf");
        }
    
    
        /**
         * 导出pdf中的图片(有问题)
         *  
         *
         * @param filename
         */
        public static void extractImage(String filename) {
            PdfReader reader = null;
            try {
                // 读取pdf文件
                reader = new PdfReader(filename);
                // 获得pdf文件的页数
                int sumPage = reader.getNumberOfPages();
                // 读取pdf文件中的每一页
                for (int i = 1; i <= sumPage; i++) {
                    // 得到pdf每一页的字典对象
                    PdfDictionary dictionary = reader.getPageN(i);
                    // 通过RESOURCES得到对应的字典对象
                    PdfDictionary res = (PdfDictionary) PdfReader
                            .getPdfObject(dictionary.get(PdfName.RESOURCES));
                    // 得到XOBJECT图片对象
                    PdfDictionary xobj = (PdfDictionary) PdfReader.getPdfObject(res.get(PdfName.XOBJECT));
                    if (xobj != null) {
                        for (Iterator it = xobj.getKeys().iterator(); it.hasNext(); ) {
                            PdfObject obj = xobj.get((PdfName) it.next());
                            if (obj.isIndirect()) {
                                PdfDictionary tg = (PdfDictionary) PdfReader
                                        .getPdfObject(obj);
                                PdfName type = (PdfName) PdfReader.getPdfObject(tg
                                        .get(PdfName.SUBTYPE));
                                if (PdfName.IMAGE.equals(type)) {
                                    PdfObject object = reader.getPdfObject(obj);
                                    if (object.isStream()) {
                                        PRStream prstream = (PRStream) object;
                                        byte[] b;
                                        try {
                                            b = reader.getStreamBytes(prstream);
                                        } catch (UnsupportedPdfException e) {
                                            b = reader.getStreamBytesRaw(prstream);
                                        }
                                        FileOutputStream output = new FileOutputStream(String.format("d:/pdf/output%d.jpg", i));
                                        output.write(b);
                                        output.flush();
                                        output.close();
                                    }
                                }
                            }
                        }
                    }
                }
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 解析pdf文件
         *
         * @param fileName  pdf文件的路径
         */
        public String pdfReader(String fileName) {
            try {
                InputStream inputStream = new BufferedInputStream(new FileInputStream(new File(fileName)));
                // PDFParser parser = new PDFParser( inputStream );
                // parser.parse();
                PDDocument pdfDocument = PDDocument.load(inputStream);
                // PDDocument pdfDocument = parser.getPDDocument();
                StringWriter writer = new StringWriter();
                PDFTextStripper stripper = new PDFTextStripper();
                stripper.writeText(pdfDocument, writer);
                String contents = writer.getBuffer().toString();
    
    
                /*
                 * PDDocumentInformation documentInformation =
                 * pdfDocument.getDocumentInformation(); System.out.println("标题:" +
                 * documentInformation.getTitle()); PDDocumentInformation info =
                 * pdfDocument.getDocumentInformation(); System.out.println("标题:" +
                 * info.getTitle()); System.out.println("主题:" + info.getSubject());
                 * System.out.println("作者:" + info.getAuthor());
                 * System.out.println("关键字:" + info.getKeywords());
                 * System.out.println("应用程序:" + info.getCreator());
                 * System.out.println("pdf 制作程序:" + info.getProducer());
                 * System.out.println("作者:" + info.getTrapped());
                 * System.out.println("创建时间:" + dateFormat(info.getCreationDate()));
                 * System.out.println("修改时间:" +
                 * dateFormat(info.getModificationDate()));
                 */
    
    
                /** 文档页面信息 **/
                PDDocumentCatalog cata = pdfDocument.getDocumentCatalog();
                //文档文字内容
                String content = "";
                List pages = cata.getAllPages();
                int count = 1;
                for (int i = 0; i < pages.size(); i++) {
                    PDPage page = (PDPage) pages.get(i);
                    if (null != page) {
                        // 本页面文字内容
                        StringWriter sw = new StringWriter();
                        PDFTextStripper pst = new PDFTextStripper();
                        pst.setStartPage(i + 1);
                        pst.setEndPage(i + 1);
                        pst.writeText(pdfDocument, sw);
                        content += sw.getBuffer().toString();
                        // System.out.println(content);
                        // PDResources res = page.findResources();
                        // 获取页面图片信息
                        // Map imgs = res.getImages();
                        // if (null != imgs) {
                        // Set keySet = imgs.keySet();
                        // Iterator it = keySet.iterator();
                        // while (it.hasNext()) {
                        // Object obj = it.next();
                        // PDXObjectImage img = (PDXObjectImage) imgs.get(obj);
                        // img.write2file("D:/pdf/" + count);
                        // count++;
                        // }
                        // }
                    }
                }
                return content;
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }

     

    展开全文
  • 4、生成一个PDF文件:D:\\zhouyl\\BTImagePDF.pdf,第一列为文字,第二列为图片(pdfTable),并自动调整图片大小 5、生成一个PDF文件:D:\\zhouyl\\BTPdf.pdf,显示单元格表头和每一列的数据 6、将XML文件:D:/...
  • java解析PDF

    千次阅读 2019-08-05 15:48:28
    java解析PDF文件(汉字及图片) 在工程需求中如何处理java解析pdf文件。 首先准备jar包:Spire.Pdf.jar,本人使用的是2.6.3版本。 1、解析pdf文字格式: public static String ExportPDFUtil(String fileName) ...
  • javaPDF文件写入 文字图片

    千次阅读 2020-09-20 18:49:28
    javaPDF文件写入 文字图片 pdf作为一种阅读体验性非常好的文件格式,那么在实际项目中也经常会涉及到PDF文件的操作, 在公司中,我遇到实现签署文件的这样一个功能,用itextPdf 实现,在网上看了一些文章,总结了...
  • 更多的人是想先实现后理解吧,在这里有一个重要的东西叫做驯化文件目录,少了这个东西的话就很不好操作,话不多说,上代码,首先上场的是解析pdf图片并保存至自定义文件夹中` PdfDocument doc = new PdfDocument...
  • Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
  • Java 读取PDF中的文本和图片

    千次阅读 2019-10-02 02:59:26
    本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法。分别调用方法extractText()和extractImages()来读取。 使用工具:Free Spire.PDF for Java(免费版) Jar文件获取导入: 方法1:通过官网下载jar...
  • java读取pdf内容(图片和文本) 使用pdfbox,maven如下 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.12</...
  • java用pdfbox解析pdf文件中的表格

    千次阅读 2019-09-09 14:19:35
    需要解析pdf是一个发票 没有废话,先导入pdfbox的依赖 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <ver...
  • java提取PDF文字坐标

    万次阅读 热门讨论 2017-12-09 16:08:59
    常用java操作PDF的库有PDFbox和itext,下面我会介绍如何使用PDFbox和itext来提取...1、通过定义一个类实现RenderListener,可以通过里面的几个方法来操作PDF中的文字图片 import java.awt.Color; import java.awt.
  • java提取pdf文字坐标

    2019-12-30 10:14:17
    提取pdf文字坐标再pdf转换成对应图片大小像素坐标 pdfbox:2.0.15提取pdf文字 package com.exampl.pdf; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org...
  • java读取图片文字

    千次阅读 2019-12-19 11:05:29
    java自动读取图片文字信息代码片工具类 java中识别文字使用的软件是tesseractocr(使用的版本是3.02,3以后的版本才支持中文),这个软件需要安装在本地电脑中,安装的过程中全部都按照默认进行安装(以便于Java...
  • 文章目录依赖读取pdf文本和图片简单读取word文字读取excel输出到exceloffice转pdf 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <...
  • 对于识别图片读取图片文字信息很有用,对于验证码图标很有用
  • 通过解析pdf,将pdf中的表格、图片文字进行分类提取。怎么做?
  • 根据pdf中的文字来插入图片。之前有一个签章的功能在要将签名插入到pdf指定位置,然后进行盖章。将代码复制到具体的业务代码中即可,代码可以完美运行,亲测。也可在新建测试方法,先进行测试。代码如下。 package ...
  • 2.结合TestRenderListener 获取pdf里的文字坐标 ,增加偏移量,并控制图片大小,使签名图片落在合适位置,保存文件 <dependency> <groupId>com.itextpdf</groupId> <artifactId>...
  • 最近在做pdfbox相关的开发,但是只能简单的读取文本和图片,希望能够获取pdf图片、 表格、页眉、页脚,包括图片及表格的坐标

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,439
精华内容 2,175
关键字:

java解析pdf图片文字

java 订阅