0
点赞
收藏
分享

微信扫一扫

原创力文档-免费下载

登高且赋 2022-02-15 阅读 235
java

原创立文档免费下载

目标

正如标题所述,我们要免费下载原创立文档。

引用知乎的一篇文章:免费下载[原创力]的付费文档
针对的是不会写代码的朋友

思路

此次我们的目标是下载 运城市智慧城市统一市民服务热线综合运维平台操作手册v2 0.pdf

在这里插入图片描述
我们根据请求可以看到,该篇文章的每一页是以图片的形式显示的,所以我们就需要如何构造出请求,用于获取到所有的图片,之后将图片转换成pdf也就是思路。
所以思路:

下载所有的图片

我们发现,当page在1-6之间,返回的所有的数据都是1-6的数据。所以我们从page = 2 开始,每隔6页请求下一页数据,而且我们可以看到,总页数是72页的数据

在这里插入图片描述

获取所有的图片地址

 public void getFileName(){
        // 1:先下载图片,之后
        path = "C:\\test\\book118\\";
        List<String> result = new ArrayList<>();
        for (int page = 2; page <=72; page+=6 ){
            String indexUlr = "https://openapi.book118.com/getPreview.html?&project_id=1&aid=351627354&t=43db8978a42858e8b44f1f121c83b620&view_token=n_7kmZ0I4WTIPtaJdSAmx5iZNJ5Cu8DY&page="+page+"&filetype=pdf&_=1644827283333";
            String jsonStr = "";
            try {
                jsonStr = HttpUtils.get(indexUlr);
            } catch (IOException e) {
                e.printStackTrace();
            }

            System.out.println(jsonStr);
            jsonStr = jsonStr.replace("jsonpReturn(","");
            jsonStr = jsonStr.substring(0,jsonStr.lastIndexOf(");"));;
            JSONObject JO = JSONObject.parseObject(jsonStr);
            JSONObject dataJO = JO.getJSONObject("data");
            Set<String> keySet = dataJO.keySet();
            for (String key : keySet) {
                String imgUrl = "http:" +dataJO.getString(key);
                result.add(key +"\t" + imgUrl);
            }
            try {
                Thread.sleep(5_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        try {
            FileUtils.writeLines(new File("text.txt"),result);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("下载完成");
    }
    

图片下载工具

public class DownLoadFileUtil {

    //java 通过url下载图片保存到本地
    public static void download(String urlString, String path,String fileName ) throws Exception {
        // 构造URL
        URL url = new URL(urlString);
        // 打开连接
        URLConnection con = url.openConnection();
        // 输入流
        InputStream is = con.getInputStream();
        // 1K的数据缓冲
        byte[] bs = new byte[1024];
        // 读取到的数据长度
        int len;
        // 输出的文件流
        fileName = path + fileName + ".png";  //下载路径及下载图片名称
        File file = new File(fileName);
        FileOutputStream os = new FileOutputStream(file, true);
        // 开始读取
        while ((len = is.read(bs)) != -1) {
            os.write(bs, 0, len);
        }
        System.out.println(fileName);
        // 完毕,关闭所有链接
        os.close();
        is.close();
    }
}

图片下载完成:
在这里插入图片描述

图片转换成pdf文档

public static void main(String[] args) throws Exception {
        String fileName = "C:\\test\\book118\\%s.png";
        String path = "C:\\test\\book118\\";
        String[] paths = new String[72];
        for (int i = 0; i < paths.length; i++) {
            paths[i] = String.format(fileName,i+1);
        }
        File file = imageToPdf(paths);

        file.delete();
    }

    public static File imageToPdf(String[] images) throws Exception {
        File tempFile = File.createTempFile("expeortPDFt", ".pdf");
        Document document = new Document();
        PdfWriter.getInstance(document, new BufferedOutputStream(new FileOutputStream(tempFile)));
        document.open();
        for (String path : images) {
            //获取图片对象
            Image image = Image.getInstance(path);

            float width = image.getWidth();
            float height = image.getHeight();

            if (width < height) {
                //竖向
                document.setPageSize(PageSize.A4);
                //设置图片在PDF中的位置
                image.setAbsolutePosition(30, 35);
                //设置图片在PDF中的大小
                //默认
                image.scaleToFit(1024, 768);
            } else {
                //横向
                document.setPageSize(PageSize.A4.rotate());
                image.scaleToFit(770, 523);

                float offsetX = (770 - image.getScaledWidth()) / 2;
                float offsetY = (523 - image.getScaledHeight()) / 2;

                image.setAbsolutePosition(36 + offsetX, 36 + offsetY);
            }
            document.newPage();
            document.add(image);
        }
        document.close();

        return tempFile;
    }

pom相关的依赖信息

<properties>
        <common-lang3.version>3.12.0</common-lang3.version>
        <commons-io.version>2.8.0</commons-io.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.3</version>
        </dependency>
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${common-lang3.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commons-io.version}</version>
        </dependency>

    </dependencies>

总结:

思路:先下载图片,将图片转换成pdf
下载图片的时候,需要注意请求page的参数,每隔6个请求一次,不能频繁的请求,有可能获取不到数据,尽量多加一点睡眠时间

图片转pdf,读取图片需要有序,不然生成的pdf会是乱序的。

举报

相关推荐

0 条评论