可重复使用PDFBox的一个pdf小像iText的?(Can duplicating a pdf w

2019-07-18 10:38发布

我读的PDF和输出与在它原始的PDF的多个副本的PDF文件。 我做同样的事情两个测试PDFBox的和iText的 。 iText的创建一个更小的输出,如果我单独重复每一页。

问题:是否有另一种方式在PDFBox的导致较小的输出PDF文件做到这一点。

对于一个示例的输入文件,生成两个副本到与两个工具的输出:

  • 原始PDF文件大小:30K
  • PDFBox的(V 1.7.1)生成的PDF:84K
  • iText的(V 5.3.4)生成的PDF:35K

对于PDFBox的Java代码(抱歉造成你的错误处理)。 注意它一遍又一遍地读取输入,并复制它作为一个整体:

PDFMergerUtility merger = new PDFMergerUtility();
PDDocument workplace = null;
try {
    for (int cnt = 0; cnt < COPIES; ++cnt) {
        PDDocument document = null;
        InputStream stream = null;
        try {
            stream = new FileInputStream(new File(sourceFileName));
            document = PDDocument.load(stream);
            if (workplace == null) {
                workplace = document;
            } else {
                merger.appendDocument(workplace, document);
            }
        } finally {
            if (document != null && document != workplace) {
                document.close();
            }
            if (stream != null) {
                stream.close();
            }
        }
    }

    OutputStream out = null;
    try {
        out = new FileOutputStream(new File(destinationFileName));
        workplace.save(out);
    } finally {
        if (out != null) {
            out.close();
        }
    }
} catch (COSVisitorException e1) {
    e1.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (workplace != null) {
        try {
            workplace.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码与iText的做到这一点。 注意通过页面和转账每一页的输出如何加载输入文件页面:

Document document = null;
PdfReader reader = null;
InputStream inputStream = null;
FileOutputStream outputStream = null;
try {
    inputStream = new FileInputStream(new File(sourceFileName));
    outputStream = new FileOutputStream(new File(destinationFileName));
    document = new Document();
    PdfCopy copy = new PdfSmartCopy(document, outputStream);
    document.open();
    reader = new PdfReader(inputStream);
    // loop over the pages in that document
    int pdfPageNo = reader.getNumberOfPages();
    for (int page = 0; page < pdfPageNo;) {
        PdfImportedPage onePage = copy.getImportedPage(reader, ++page);
        // duplicate each page N times
        for (int i = 0; i < COPIES; ++i) {
            copy.addPage(onePage);
        }
    }
    copy.freeReader(reader);
} catch (DocumentException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        reader.close();
    }
    if (document != null) {
        document.close();
    }
    try {
        if (inputStream != null) {
            inputStream.close();
        }
        if (outputStream != null) {
            outputStream.close();
        }
    } catch (IOException e) {
        // do nothing
    }
}

两者都是由该所包围:

public class Duplicate {

    /** The original PDF file */
    private static final String sourceFileName = "PDF_CI_US2CA.pdf";

    /** The resulting PDF file. */
    private static final String destinationFileName = "itext_output.pdf";
    private static final int COPIES = 2;

    public static void main(String[] args) {
            ...
        }
}

Answer 1:

使用下面的解决方案,我能够创建有很多重复的页面的PDF文件,对储存的影响微乎其微。

PDDocument samplePdf = null;
try {
    samplePdf = PDDocument.load(PDF_PATH);
    PDPage page = (PDPage) samplePdf.getDocumentCatalog().getAllPages().get(0); 

    for(int i = 0; i < COPIES; i++) {
        samplePdf.importPage(page);
    }

    samplePdf.save(SAVE_PATH); //$NON-NLS-1$

} catch (IOException e) {
    e.printStackTrace();
} catch (COSVisitorException e) {
    e.printStackTrace();
}

在我第一次尝试我用, samplePdf.addPage(page) ,但如预期没有奏效。 所以,很显然存在之间的差异addimport功能。 我得检查源代码或文档明白。 无论如何,这应该可以帮助您制定与您PDFBox的需求的解决方案。



文章来源: Can duplicating a pdf with PDFBox be small like with iText?