java - itext 将 PDF 分割成多个 PDF,但大小相同

标签 java pdf split itext

这是我将单个 PDF 拆分为按页面拆分的多个 PDF 的代码:

public static String splitAndRenamePdf(InputStream file, String targetDir) {
        try {
            PdfReader reader = new PdfReader(file);
            int n = reader.getNumberOfPages();
            for (int i=1; i <= n; i++) {
                Document document = new Document(reader.getPageSizeWithRotation(i)); //I tried with 1 too
                PdfCopy writer = new PdfCopy(document, new FileOutputStream(targetDir+File.separatorChar+i+".pdf"));
                document.open();
                PdfImportedPage page = writer.getImportedPage(reader, i);
                writer.addPage(page);
                document.close();
                writer.close();
            }
            return "from 01 to "+n;
        } catch (IOException | DocumentException exc) {
            System.out.println("splitAndRenamePdf Exception: "+exc.getMessage());
            return null;
        }
    }

内容是正确的,但生成的 n 个文件的大小与原始文件的大小相同。

有人可以帮助我吗?我可以更改库,因为我不再使用 iText。

最佳答案

我写解决方案... 我希望它可以帮助别人。

private final static RenderListener nopListener = new RenderListener() {
        @Override
        public void renderText(TextRenderInfo renderInfo) { }

        @Override
        public void renderImage(ImageRenderInfo renderInfo) { }

        @Override
        public void endTextBlock() { }

        @Override
        public void beginTextBlock() { }
    };

static class Do implements ContentOperator {
        public void invoke(PdfContentStreamProcessor processor, PdfLiteral operator, ArrayList<PdfObject> operands) {
            PdfName xobjectName = (PdfName)operands.get(0);
            names.add(xobjectName);
        }

        final List<PdfName> names = new ArrayList<>();
    }

private static void fixPdfReader(PdfReader reader) throws IOException {
        PdfContentStreamProcessor processor = new PdfContentStreamProcessor(nopListener);
        Do doOp = new Do();
        processor.registerContentOperator("Do", doOp);
        int totPages = reader.getNumberOfPages();
        for (int page = 1; page <= totPages; page++) {
            PdfDictionary resources = reader.getPageResources(page);
            if (resources == null) {
                System.out.printf("!!! page %d has no resources\n", page);
                continue;
            }
            doOp.names.clear();
            processor.processContent(ContentByteUtils.getContentBytesForPage(reader, page), resources);
            PdfDictionary newResources = new PdfDictionary();
            newResources.putAll(resources);
            PdfDictionary xobjects = newResources.getAsDict(PdfName.XOBJECT);
            PdfDictionary newXobjects = new PdfDictionary();
            for (PdfName key: doOp.names) {
                newXobjects.put(key, xobjects.get(key));
            }
            newResources.put(PdfName.XOBJECT, newXobjects);
            reader.getPageN(page).put(PdfName.RESOURCES, newResources);
        }
        reader.removeUnusedObjects();
    }

public static String fixAndSplitPDF(InputStream inputStream, String targetDir) {
        try {
            PdfReader reader = new PdfReader(inputStream);
            fixPdfReader(reader);
            //this method is in the question!
            return splitAndRenamePdf(reader, targetDir);
        } catch (IOException exc) {
            //LOG Exception...
            return null;
        }
    }

关于java - itext 将 PDF 分割成多个 PDF,但大小相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59794056/

相关文章:

java - 删除子字符串的自定义 Java 方法 - 删除引号时的奇怪行为

python - 使用正确的密码解密受 aes-256 位保护的 pdf

Excel VBA : Saving and Attaching a worksheet as pdf

python - 将一列数据框拆分为多列数据框

java - 按之间的数字分割字符串

java - 执行net use命令

java - 如何将文件从一个 S3 客户端移动到另一个 S3 客户端

android - 在数字前的空格处拆分字符串

Java,不支持的类版本错误。我怎样才能解决这个问题

java - 如何在 Java 中将 n 列导出为 PDF 的标题?