使用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) {

...

}

}

回答:

使用以下解决方案,我能够创建具有许多重复页面的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设计解决方案。

以上是 使用PDFBox复制pdf是否可以像使用iText一样小? 的全部内容, 来源链接: utcz.com/qa/399384.html

回到顶部