毕设6:总结

Posted on 2024-02-27 17:42  Capterlliar  阅读(4)  评论(0编辑  收藏  举报

呃好久没写了感觉没什么好写的,然后做完了(

1. List的add只是一个接口,并没有实现,各种操作请认准arraylist。

2. 关于Task

一个JavaFX异步执行的类,但请单独开一个线程给它不然还是同步的。

3. 关于TreeView界面乱跳的问题

treeitem expend的时候会展示父节点和尽量多的子节点,但可能是我的treeitem太高了所有scroll的地方不对,最终选择手动scrollTo

4. Cannot invoke "javafx.css.Styleable.getStyleableParent()" because "<local3>" is null

没查出来什么原因,可能初始化时候总有这样那样的问题。没事少用xxx.setStyle("...")

5. 关于PDF提取文字断行的问题

由于排版的原因PDF会在一个段落中间加若干换行符,提取成txt后不太方便。但它普通换行和段落换行也没啥区别,粗浅观察了一下,段落之前会有两个空字符串,于是重写了一下outputstream的write方法手动加换行符。

6. PDF提取图片

PDFBox2.0之后没有getImage方法了,要获取资源然后一个个判断是不是PDImageXObject。但有的图片会提取不出来,debug了一下发现是藏在PDFormXObject里面,递归导出一下:

public static List<RenderedImage> getImagesFromResources(PDResources resources) throws IOException {
        List<RenderedImage> images = new ArrayList<>();
        for (COSName xObjectName : resources.getXObjectNames()) {
            PDXObject xObject = resources.getXObject(xObjectName);
            if (xObject instanceof PDImageXObject) {
                images.add(((PDImageXObject) xObject).getImage());
            } else if (xObject instanceof PDFormXObject) {
                images.addAll(getImagesFromResources(((PDFormXObject) xObject).getResources()));
            }
        }
        return images;
    }
    public static void getImages(List<Pair<Integer, Integer>> pages, File file, String dest) throws IOException {
        PDDocument document = PDDocument.load(file);
        String filename = FileUtil.getPDFFilename(file);

        if(pages.isEmpty()) {
            int end = document.getNumberOfPages();
            pages.add(new Pair<>(1, end));
        }

        for(Pair<Integer, Integer> pair:pages) {
            int start = pair.getKey();
            int end = pair.getValue();

            for(int i=start;i<=end;i++) {
                PDPage page = document.getPage(i-1);
                PDResources resources = page.getResources();
                List<RenderedImage> images = getImagesFromResources(resources);
                int cnt = 1;
                for(RenderedImage image:images) {
                    String newFile = FileUtil.getUniqueFilename(dest,  filename + " p"+ i + "(" + cnt + ")", ".png");
                    File tempfile = new File(newFile);
                    tempfile.createNewFile();
                    ImageIO.write(image, "png", tempfile);
                    cnt++;
                }
            }
        }
        document.close();
    }
View Code

啊缓存图片对内存是不是不太好,不过一篇论文也不会有太多太大的图,先观察一下。

7. 在FileUtil里写了一堆又破又长的代码判字符串,不想改正则了就这样吧。

8. 其他逻辑写毕设论文的时候再说吧。

 

TODO:内存优化

看了一下平时在20M左右,但预览的时候会飙到200M,图片还是占内存的,怎么给它优化一下。