号外!论文查重必杀技之图文混编,快编不下去了。。

前言

最近作者去图文上自习,忙着写论文,像我这么渣渣的还面临着写毕业论文的困扰的时候,别人已经都论文查重了,跟我一起上自习的基友,在那捣鼓,捣鼓啥呢? 把论文中的字截图,然后粘进原文,做到鱼龙混珠。他说这样做是为了减少查重率。纳尼?窝草,这样!也行??重复率降低先不说,但是一个字一个字用QQ截图再插入论文方法太土了吧,这样做的效率太低了吧。程序员的第一反应就是我能用java来实现, 一个 idea ocurred on me 。

缕一缕

先需求分析一下,输入一段文字,让其自动的转换成图文混编的形式,看上去就好像都是一句话,其实实际上里边惨杂着好多字的图片形式。
如果使用java来实现的话需要用到文字转换图片的技术,还有就是写入doc的技术。

原理

大概已经知道了什么情况,使用两个手段就能实现这个小小的需求。
1.验证码生成技术
2.java操作doc技术
验证码笔者了解,而且会做,java操作doc技术还是第一玩,于是查了一下,感觉实现不是很难。

效果

这里写图片描述

这里写图片描述

实现

文字转成图片

将文字转换成图片的图片生成代码
使用了Graphics2D 生成图片,代码很简单。

public ByteArrayOutputStream makeOne(String word,Params param) throws Exception 
    {
            //创建内存图像
            image = new BufferedImage(params.getWidth(), height, 
                    BufferedImage.SCALE_SMOOTH) ;
            Graphics2D g = image.createGraphics() ;
            g.setColor(Color.white);
            g.drawRect(0,0, width, height); //画边框
            g.fillRect(0,0, width, height); //填充背景颜色

            g.setColor(param.getTextColor()); //设置字体颜色
            Font font = new Font("simsun",0,20) ;
            g.setFont(font);// 设置字体
            g.drawString(word,0,18);

            ByteArrayOutputStream bos = new ByteArrayOutputStream() ;

            ImageIO.write(image, "png", bos) ; //将图片格式转换成 bos数组

    return  bos ;
    }

有人问为什么要将图片BufferedImage对象转换为ByteArrayOutputStream 流呢? 因为在doc生成中要用到bos流的构造所以需要转换一下。

写入DOC

java操作doc有很多优秀的开源框架,其中有名的一个就是使用itext ,itext提供强大的java操控数据库,包括表格,图片,段落等等。这里我们只需要如何把图片和文字写进去就行了。
创建一个WoldHelper 类负责插入文字和图片

导入Itextjar包

IText 2.1.7 jar 包,可以利用此包来导出word文档
http://download.csdn.net/detail/ap0906230/6821411

WoldHelper.java


public class WordHelper {

    private Document document  ;
    private BaseFont bfChinese ; 
    private Paragraph context ;

    public WordHelper(Document document,Paragraph context) {
        this.document  = document ;
        this.context = context ;
    }


    public void openDocument(String filePath) throws DocumentException,  
    IOException {  
//       建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中  
        RtfWriter2.getInstance(this.document, new FileOutputStream(filePath));  
        this.document.open();  
//       设置中文字体  
/*        this.bfChinese = BaseFont.createFont("STSongStd-Light",  
                "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);*/

    }


    /** 
     * @param contextStr 内容 
     * @param fontsize 字体大小 
     * @param fontStyle 字体样式 
     * @param elementAlign 对齐方式 
     * @throws com.lowagie.text.DocumentException
     */  
    public void insertContext(String contextStr,int fontsize) throws DocumentException{  
        // 正文字体风格  
        Font contextFont = new Font(fontsize);  
      //  context = new Paragraph(contextStr) ;
        //设置行距  
        context.setLeading(3f);
        // 正文格式左对齐  
      //  context.setAlignment(elementAlign);
        context.setFont(contextFont);  
        // 离上一段落(标题)空的行数  
     //   context.setSpacingBefore(1);
        // 设置第一行空的列数  
      //  context.setFirstLineIndent(20);  
        context.add(contextStr) ;
    }


    /**
     * 
     * @param os 图片os流
     * @param param 格式参数
     */
    public  void insertPhoto(ByteArrayOutputStream os,Params param)
    {       byte [] b = os.toByteArray() ;
           Image img = null;
        try {
            img = Image.getInstance(b);
             // img.setAbsolutePosition(0, 0);//设置图片的绝对位置
            img.setAlignment(Image.MIDDLE);// 设置图片显示位置
          //  img.scaleAbsolute(param.getWidth(), param.getHeight());// 直接设定显示尺寸
          //  img.scalePercent(70);// 表示显示的大小为原尺寸的20%

        } catch (BadElementException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            context.add(img) ; //加上图片
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

控制写入

有了生成图片,有了写入图片和文字的方法。如何控制哪些字体是文字哪些字体是图片,这里我使用了将字符串分割,使用随机方法的方式去挑选一些文字作为图片。组织有规律的写入doc。

public class Converter {

    private Document document  ;
    private BaseFont bfChinese ; 
    private WordHelper wordHelper ;
    private String contnet ; 
    private Params param  ;
    private Paragraph context ;

    //组织转换方法。
    public int convert(List<StringBuilder> sbList,Params param) throws Exception
    {
        int flag = 0 ;
        StringBuilder sb = new StringBuilder() ;
        Document document = new Document() ;
        Paragraph context = new Paragraph();
        wordHelper = new WordHelper(document,context) ;
        wordHelper.openDocument("E:\\shaoduo_paper.doc"); //存到的路径
        if(sbList!=null||sbList.toString().length()!=0)
        {
            for(int i = 0 ;i<sbList.size(); i++)
            {
                Random r = new Random() ;
                String detail[] = sbList.get(i).toString().split(""); 
                int position = r.nextInt(detail.length) ;
                for(int j = 0 ; j<detail.length ;j++)
                {
                    if(position==j)
                    {
                        PhotoMaker maker = new PhotoMaker(param);
                        ByteArrayOutputStream os =maker.makeOne(detail[position], param) ;
                        wordHelper.insertPhoto(os, param);
                    }else
                    {
                        wordHelper.insertContext(detail[j], 20);
                    }
                }

            }

                document.add(context);  
                document.close(); //更改文档完成
                flag = 1 ;
        }

        return flag ;

    }

    // 通过,分割语句
    public List<StringBuilder> splitWordsToArry(String str)
    {  
        String strArry[]  = str.split("") ;
        StringBuilder sb = new StringBuilder() ;
        List<StringBuilder> sbList =new ArrayList<StringBuilder>();
        for(int i=0 ;i<strArry.length;i++)
        {
            if(!strArry[i].equals(",")&&!strArry[i].equals("。")&&i!=strArry.length-1)
            {
                sb.append(strArry[i]) ;
            }else
            {
                sb.append(strArry[i]) ; // 只为把逗号加上不然就落下了
                sbList.add(sb);
                sb = new StringBuilder() ;
            }

        }
        return sbList;




}


}

总结

以上代码只是核心代码,源代码附上。
http://pan.baidu.com/s/1slk8Rq1


版权声明
author :shaoduo
原文来自:http://blog.csdn.net/shaoduo/article/details/72829724
其他出处均为转载,原创作品,欢迎读者批评指正。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值