当前位置: 首页 > 知识库问答 >
问题:

用PDFBox复制pdf文件能像用iText一样小吗?

龙俊德
2023-03-14

我正在阅读在一个PDF和输出一个PDF与多个副本的原始PDF在其中。我通过对PDFBox和iText执行相同的操作来进行测试。如果我单独复制每个页面,iText会创建一个小得多的输出。

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

  • 原始PDF大小:30K
  • PDFBox(v1.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();
        }
    }
}
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) {
            ...
        }
}

共有1个答案

长孙智刚
2023-03-14

使用下面的解决方案,我能够创建一个包含许多重复页面的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。

 类似资料:
  • 问题内容: 我正在阅读PDF并输出其中包含原始PDF的多个副本的PDF。我通过对PDFBox和iText做同样的事情来进行测试。如果我分别复制每个页面,iText会创建一个较小的输出。 问题: 在PDFBox中还有另一种方法可以使输出的PDF变小。 对于一个示例输入文件,使用两个工具生成两个副本到输出: 原始PDF大小:30K PDFBox(v 1.7.1)生成的PDF:84K iText(v 5

  • 我希望在复制现有的pdf文件时,文件大小大致相同。我不明白为什么尺寸会增加这么多。 我也试过PdfCopy类。我使用PDFcopy遵循了2种方法: 逐页复制。 对pdfcopy对象调用setMergeFields(),然后调用pdfcopy.AddDocument(reader); 但这两种方法的问题都是,它会从pdf文件中丢弃一些非内容的元数据,因此当Adobe Reader打开新的pdf时会损

  • 我的目的是绘制一个上传的图像,我不知道的尺寸在一个PDF文件的一个空页(DINA4)。对于水平图像,我有一个带有一个水平空页的PDF文件,对于垂直图像,我有一个带有一个垂直页的PDF文件。 这是我到目前为止的代码: 对于垂直图像,一切工作都很好(我更希望图像在页面的中心,但这将是下一步)。

  • 我正在使用iText生成Pdf。但当我试图在pdf中添加图像时, 我mage.get实例(新的URL(timetableResource.getImageUrl()));document.add(学校标志); 但我得到的错误是 HTTP状态500-服务器为URL返回了HTTP响应代码400:http://139.59.72.150:8080/sms/attachments/23/42/school

  • 有人能给我举个例子,说明如何使用ApachePDFBox转换不同图像中的PDF文件(PDF的每一页对应一个图像)?

  • 问题内容: 我们需要将现有的多个PDF导入到一个新的PDF中。部分代码的工作方式类似于 iText in Action 2nd Edition 第6.2.1节中的示例代码: 但是,我们只是意识到在处理带有注解的可填充PDF(在我们的示例中,那些PDF已经填充了数据)时,所有填充数据都会丢失在新PDF中。 我们在本书的同一部分找到了答案: 重要的是要理解呈现页面内容所需的资源与页面的交互功能之间的区