java复制pdf_使用PDFBox复制pdf是否可以像使用iText一样小?

我正在阅读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) {

...

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值