java操作pdf>>pdfBox使用体験

36536 ワード

pdfBoxは中国語に対してとても友好的ではありません.もし皆さんがpdfに文字を挿入する操作をしたいなら、itextを使うことを勧めます.もし操作したpdfに中国語がないなら、或いはpdfファイルに画像を挿入し、ページを削除するだけで、引き続き見てください.
前言:
先日、会社で手配した仕事を完成しました.暇な時間を利用して、javaの操作pdfの機能を使い始めました.ネットでpdfBoxを見つけました.pdfBoxはapphが提供した無料で、オープンソースのpdf操作ツールです.使いやすいです.githubもダウンロードできます.私もアップロードしました.
1まず、jarを導入します
これは全部のpdfboxを含んでいます.これを導入すればいいです.(ツール類を探している時に、他の博がpdfboxの多くの種類を主導しているのを見ました.そして、頭の中にも入ってきました.結局、jarパッケージが衝突しました.一つだけ導入しました.それは公式が統合されているものです.十分です.)
        <dependency>
            <groupId>org.apache.pdfboxgroupId>
            <artifactId>pdfbox-appartifactId>
            <version>1.8.10version>
        dependency>
2.あなたのプロジェクトでツールクラスを作成します.
2.1この類の名前は自由です.私はpdfUtilを取ったのです.
2.2もちろん、もしあなたが操作をデータベースに記録したいなら、pdfの実体類という実体類を作成してもいいです.皆さんの自由に作成しないでください.私は私の実体類の属性を貼ります.参考にしてください.
    //      :pdfDomainVO

    private Integer id;//id

    private Date time;//    

    private String filename;//   

    private String filesize;//    

    private String filetype;//    

    private String details;//    

    private String content;//pdf   

    private String outputfile;//    (    )

    private String inputfile;//    pdf  

    private String strtofind;//       

    private String message;//     

    private String imagefile;//    

    private String imagelist;//    

    private Integer pageno;//    

    private Integer pages;//   

    private Integer rid;//...

    private Integer pageoperation;//    

    private Integer pagestart;//   

    private Integer pageend;//   

    private String position;//  :X,Y

    private String fileSizeAfter;//       

    private Integer status;//  

    private Integer afterPages;//     

    private Integer imgSize;//    
3.コードをpdfUtilで書く
PS:私はpdf DomainVO本体類に役に立つと思います.上に貼った属性を参考にしてください.
みんなはpdfbox-1.8.90.zipフォルダの中でexamplesフォルダを見つけることができます.
いろいろな事例があります.例えば:
1 pdfファイルを作成します.
2 pdfの全ての文字情報を読み出す(Stringで受信可能)
3 pdfの文字を置換します.(中国語はまだ解決していません.すみません.)
4 pdfに画像を挿入する
などの操作が……
PS:コードを貼ります.
—1複数の空白ページを作成します.
/***
     *   1       
     * @param file
     * @throws IOException
     * @throws COSVisitorException
     */
    public static void createBlank( String outputFile ) throws IOException, COSVisitorException
    {
        //    pdf   
        PDDocument document = null;
        try
        {
            document = new PDDocument();
            //   pdf   
            PDPage blankPage = new PDPage();
            PDPage blankPage1 = new PDPage();
            PDPage blankPage2 = new PDPage();
            //     
            document.addPage( blankPage );
            document.addPage( blankPage1 );
            document.addPage( blankPage2 );
            //          , "H:\\text.pdf"
            document.save( outputFile );
            System.out.println("over");
        }
        finally
        {
            if( document != null )
            {
                document.close();
            }
        }
    }
—2 pdfの文字情報を読み出す(全部)
    /**
     *   pdf     (  )
     */
    public static void READPDF(String inputFile){
        //      
        PDDocument doc =null;
        String content="";
        try {
            //    pdf  
            doc =PDDocument.load(new File(inputFile));
            //    PDFTextStripper        
            PDFTextStripper textStripper =new PDFTextStripper("GBK");
            content=textStripper.getText(doc);
            vo.setContent(content);
            System.out.println("  :"+content);
            System.out.println("    "+doc.getNumberOfPages());  
            //    
            doc.close();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
—3 pdfでテキスト情報を読み出す(指定ページ)
    /**
     *   pdf     (        )
     */
    public static pdfDomainVO readPageNO(pdfDomainVO vo){   
        String content="";        
        try{
            PDDocument document = PDDocument.load(vo.getInputfile());
            //     
            int pages = document.getNumberOfPages();
             //      
             PDFTextStripper stripper=new PDFTextStripper();
             //        
             stripper.setSortByPosition(true);
             stripper.setStartPage(vo.getPageno());
             stripper.setEndPage(vo.getPageno());
             //    
             content = stripper.getText(document);
             vo.setContent(content);
             System.out.println("function : readPageNO over");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return vo;
    }
—4指定されたpdfファイルの文字の内容を置き換える(これは複雑です.アプリを見て長い間見ました.そして一つずつのコメントを添付しました.)
/**
     *     pdf       
     * @param args
     */
    public static pdfDomainVO replaceContent(pdfDomainVO vo)
    throws IOException,COSVisitorException{
        //        
        PDDocument doc =null;
        try {
            //    
            doc =PDDocument.load(vo.getInputfile());
            //      
            List pages= doc.getDocumentCatalog().getAllPages();
            //   i     
            PDPage page = (PDPage)pages.get( vo.getPageno() );
            //        page   
            PDStream contents = page.getContents();
            //PDF      (      PDF         ,  )
            PDFStreamParser parser =new PDFStreamParser(contents.getStream());
            //         
            parser.parse();
            // list        
            List tokens =parser.getTokens();
            for (int j = 0; j < tokens.size(); j++) {
                //    object       
                Object next = tokens.get( j );
                //instanceof                 
                if(next  instanceof PDFOperator ) {
                    //pdf     
                    PDFOperator op =(PDFOperator)next;
                    //TJ TJ         。 
                    //PDF      
                    if(op.getOperation().equals("Tj")){
                        //COSString  >>  java             。
                        COSString previous = (COSString)tokens.get( j-1 );
                        //          PDF       。 
                        String string=previous.getString();
                        //replaceFirst>>       
                        string = string.replaceFirst( vo.getStrtofind(), vo.getMessage() );
                        System.out.println(string);                           
                        System.out.println(string.getBytes("GBK"));
                        //  COSString  
                        previous.reset();
                        //        
                        previous.append(string.getBytes("GBK") );
                    }else if(op.getOperation().equals("TJ")){
                        //COSArray pdfbase    ,  PDF      
                        COSArray previous  =(COSArray)tokens.get( j-1 );
                        //  previous
                        for (int k = 0; k < previous.size(); k++) {
                            //            ,         
                            //     cosnull,   null
                            Object arrElement = previous.getObject( k );
                            if( arrElement instanceof COSString ){
                                //COSString  >>  java             。
                                COSString cosString =(COSString)arrElement;
                                //          PDF       。 
                                String string =cosString.getString();
                                //  
                                string = string.replaceFirst(  vo.getStrtofind(), vo.getMessage());
                                //  COSString  
                                cosString.reset();
                                //        
                                cosString.append(string.getBytes("GBK") );
                            }
                        }
                    }
                }
            }
             //    PDStream    
             PDStream updatedStream = new PDStream(doc);
             //         updatedStream
             OutputStream out =updatedStream.createOutputStream();
             //              。 
             ContentStreamWriter tokenWriter  =new ContentStreamWriter(out);
             //       ,        
             tokenWriter.writeTokens(tokens);
             //         
             page.setContents( updatedStream );
            //        
            doc.save(vo.getOutputfile());
            //      
            vo.setAfterPages(doc.getNumberOfPages());
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if( doc != null ){
                //    
                doc.close();
            }
        }
        return vo;
    }
—5 pdfに画像を挿入する(指定ページ数で挿入)
/**
     *  pdf     
     * @param inputFile
     * @param image
     * @param outputFile
     * @throws IOException
     * @throws COSVisitorException
     */
    public static pdfDomainVO  insertImage( pdfDomainVO vo ) 
              throws IOException, COSVisitorException{
        //     
        String[] position =vo.getPosition().split(",");
        int x =Integer.valueOf(position[0]);
        int y =Integer.valueOf(position[position.length-1]);
        //        
        PDDocument doc =null;
        try {
            //  
            doc = PDDocument.load(vo.getInputfile());
            //       pdf     
            PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get( vo.getPageno() );
            //pdfbox      
            PDXObjectImage ximage = null;
            //     .jpg     
            if( vo.getImagefile().toLowerCase().endsWith( ".jpg" ) ){
                //      
                 ximage = new PDJpeg(doc, new FileInputStream( vo.getImagefile() ) ); 
            }//   tif tiff  
            else if (vo.getImagefile().toLowerCase().endsWith(".tif") || vo.getImagefile().toLowerCase().endsWith(".tiff")){
                 ximage = new PDCcitt(doc, new RandomAccessFile(new File(vo.getImagefile()),"r"));
            }else{
                //Image BufferedImage                  
                BufferedImage awtImage = ImageIO.read( new File( vo.getImagefile() ) );
                ximage = new PDPixelMap(doc, awtImage);
            }
            //         :  、  
            PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true);
            //       
            float scale = vo.getImgSize();
            scale = scale/10;//(      0.1~1,0.5      )

            //ximage.setHeight(ximage.getHeight()/5);
            //ximage.setWidth(ximage.getWidth()/5);
             System.out.println(ximage.getHeight());
             System.out.println(ximage.getWidth());
             //       
             contentStream.drawXObject(ximage, x, y, ximage.getWidth()*scale, ximage.getHeight()*scale);
             //     
             contentStream.close();
             //    
             doc.save( vo.getOutputfile() );
             //      
             vo.setAfterPages(doc.getNumberOfPages());
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if( doc != null ){
                //    
                doc.close();
            }
        }   
        return vo;
     }
—6ページ数を指定するPDFファイルを画像に変換する
/***
     *      PDF       :
     * @param inputFile
     * @param outputFile        
     */
    public static pdfDomainVO toImage( pdfDomainVO vo ) {
        try {
            //  
            PDDocument doc = PDDocument.load(vo.getInputfile());
            //
            //int pageCount = doc.getPageCount();
            ////      
            //     pdf
            List pages = doc.getDocumentCatalog().getAllPages();
            if(vo.getPageno()!=null){
                String count=(int)(Math.random()*1000)+"-"+(int)(Math.random()*1000);
                //    
                PDPage page = (PDPage) pages.get(vo.getPageno());
                //             
                BufferedImage image = page.convertToImage();
                //         
                Iterator iter = ImageIO.getImageWritersBySuffix("jpg");
                //           
                ImageWriter writer = (ImageWriter) iter.next();
                //      
                File outFile = new File(vo.getOutputfile()+vo.getFilename()+"-"+(vo.getPageno()+1)+".jpg");
                //         
                FileOutputStream out = new FileOutputStream(outFile);
                //ImageIO   ImageOutputStream      
                ImageOutputStream outImage = ImageIO.createImageOutputStream(out);
                writer.setOutput(outImage);
                writer.write(new IIOImage(image, null, null));
            }else{
                //  
                for (int i = 0; i < pages.size(); i++) {
                    //    
                    PDPage page = (PDPage) pages.get(i);
                    //             
                    BufferedImage image = page.convertToImage();
                    //         
                    Iterator iter = ImageIO.getImageWritersBySuffix("jpg");
                    //           
                    ImageWriter writer = (ImageWriter) iter.next();
                    //      
                    File outFile = new File(vo.getOutputfile()+i+".jpg");
                    //         
                    FileOutputStream out = new FileOutputStream(outFile);
                    //ImageIO   ImageOutputStream      
                    ImageOutputStream outImage = ImageIO.createImageOutputStream(out);
                    writer.setOutput(outImage);
                    writer.write(new IIOImage(image, null, null));
                }
            }
            //   
            doc.close();
            //      
            vo.setAfterPages(doc.getNumberOfPages());
            System.out.println("over");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return vo;
    }
——–7指定ページにテキストを挿入します.
/***
     *          
     * @param inputFile
     * @param message
     * @param outputFile
     * @throws IOException
     * @throws COSVisitorException
     */
    public static pdfDomainVO InsertPageContent (pdfDomainVO vo ) throws IOException, COSVisitorException
    { 
        // the document
        PDDocument doc = null;
        try
        {
            doc = PDDocument.load( vo.getInputfile() );
            List allPages = doc.getDocumentCatalog().getAllPages();
            PDFont font = PDType1Font.HELVETICA_BOLD;
            //    
            float fontSize = 36.0f;
            PDPage page = (PDPage)allPages.get( vo.getPageno() );
            PDRectangle pageSize = page.findMediaBox();
            float stringWidth = font.getStringWidth( vo.getMessage() )*fontSize/1000f;
            // calculate to center of the page
            int rotation = page.findRotation(); 
            boolean rotate = rotation == 90 || rotation == 270;
            float pageWidth = rotate ? pageSize.getHeight() : pageSize.getWidth();
            float pageHeight = rotate ? pageSize.getWidth() : pageSize.getHeight();
            double centeredXPosition = rotate ? pageHeight/2f : (pageWidth - stringWidth)/2f;
            double centeredYPosition = rotate ? (pageWidth - stringWidth)/2f : pageHeight/2f;
            // append the content to the existing stream
            PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true,true);
            contentStream.beginText();
            // set font and font size
            contentStream.setFont( font, fontSize );
            // set text color to red
            contentStream.setNonStrokingColor(255, 0, 0);
            if (rotate)
            {
                // rotate the text according to the page rotation
                contentStream.setTextRotation(Math.PI/2, centeredXPosition, centeredYPosition);
            }
            else
            {
                contentStream.setTextTranslation(centeredXPosition, centeredYPosition);
            }
            contentStream.drawString( vo.getMessage() );
            contentStream.endText();
            contentStream.close();
            vo.setAfterPages(doc.getNumberOfPages());
            doc.save( vo.getOutputfile() );
            System.out.println("over");
        }
        finally
        {
            if( doc != null )
            {
                doc.close();
            }
        }
        return vo;
    }
—8画像を抽出して保存します.
/**
     *        
     * @param pdfDomainVO 
     * @throws IOException 
     * 
     */
    public static pdfDomainVO extractImage(pdfDomainVO vo ) throws IOException{
        //      
        PDDocument doc=null;
        try{
            //   pdf   ,  PDDocument    
            doc=PDDocument.load(vo.getInputfile());           
            /**        **/  
            //  PDDocumentCatalog      
            PDDocumentCatalog catalog = doc.getDocumentCatalog();
            //      PDPage  
            List pages = catalog.getAllPages();  
            int pageNum=pages.size();   //    
            PDPage page = null;
            if(vo.getPageno()!=null){
                 page = ( PDPage ) pages.get( vo.getPageno() ); 
                 if( null != page ){  
                     PDResources resource = page.findResources();                      
                     //         
                     Map imgs = resource.getImages();                    
                     for(Map.Entry me: imgs.entrySet()){
                         //System.out.println(me.getKey());
                         PDXObjectImage img = me.getValue();  
                         //    ,           
                         img.write2file( vo.getOutputfile() + vo.getFilename()+"-"+(vo.getPageno()+1) );     
                     }  
                 }  
            }else{
                //     
                for( int i = 0; i < pageNum; i++ ){  
                    //   i 
                     page = ( PDPage ) pages.get( i ); 
                    if( null != page ){  
                        PDResources resource = page.findResources();                      
                        //         
                        Map imgs = resource.getImages();                    
                        for(Map.Entry me: imgs.entrySet()){
                            String count=(int)(Math.random()*1000)+"-"+(int)(Math.random()*1000);
                            //System.out.println(me.getKey());
                            PDXObjectImage img = me.getValue();  
                            //    ,           
                            img.write2file( vo.getOutputfile() + count );  
                        }  
                    }  
                } 
            }
            //      
            vo.setAfterPages(doc.getNumberOfPages());
            System.out.println("extractImage:over");
        }  finally
        {
            if( doc != null )
            {
                doc.close();
            }
        }
        return vo;
    }
—9 PDFドキュメントからページを削除する(最後のページは削除できません!)
    /***
     * PDF       
     *   PDF         ,         !
     * @param inputFile
     * @param outputFile
     * @throws Exception
     */
    public static pdfDomainVO removePage(pdfDomainVO vo) throws Exception
    {
        vo.setStatus(Details.FailStatus);
        PDDocument document = null;
        try
        {
            document = PDDocument.load(vo.getInputfile() );
            if( document.isEncrypted() )
            {
                throw new IOException( "Encrypted documents are not supported for this example" );
            }
            if( document.getNumberOfPages() <= 1 )
            {
                throw new IOException( "Error: A PDF document must have at least one page, " +
                                       "cannot remove the last page!");
            }
            document.removePage( vo.getPageno() );
            document.save(vo.getOutputfile() );
            //      
            vo.setAfterPages(document.getNumberOfPages());
            //      
            vo.setStatus(Details.SuccessStatus);
            System.out.println("over");
        }
        finally
        {
            if( document != null )
            {
                document.close();
            }
        }
        return vo;
    }
pdfboxは強大で、主にオープンソースです.(TMDは中国語に対応していません.)以上は一部の機能だけです.また拡大したいなら、公式の事例とアプリを参考にしてください.
PS:残念なことに、私はちゃんと処理していません.文字を置き換える時や文字を挿入する時、中国語の文字化け問題があります.処理が上手な学生はブロガーと話してください.みんなで進歩します.
これには一文がありますhttp://blog.csdn.net/undergrowth/article/details/39136673pdfboxのそれぞれの方法に対して、属性の解析の比較的に良い文で、みんなは下を見に行くことができます.