在现有pdf的itext中附加数据

时间:2012-03-07 07:16:49

标签: java itext

我正在使用 itext pdf 库。我想在现有pdf的末尾添加一个内容。

比如说现有的pdf(比如Original.pdf)有4个页面,所以我想添加另一个页面,即第5页的内容 Hello World我添加内容并保存在相同的pdf中,即 Original.pdf

关闭后,我的Original.pdf将包含 5 页面,即 4页(已有默认内容)+ 1页,内容 Hello World我添加了内容

我正在使用此代码,但显示异常

        String in="Original.pdf";
        String out="Original.pdf";        

        PdfReader reader = new PdfReader(in);
        PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(out));

        int totalPages=reader.getNumberOfPages();
        stamper.insertPage(totalPages+1, PageSize.A4);
        stamper.addAnnotation(
                                PdfAnnotation.createText(
                                                            stamper.getWriter(),
                                                            new Rectangle(30f, 750f, 80f, 800f),
                                                            "inserted page", "This page is the title page.",
                                                            true,
                                                            null)
                                ,
                                reader.getNumberOfPages()
                             );
        stamper.close();

java.io.EOFException的

提前致谢。

2 个答案:

答案 0 :(得分:4)

我认为问题来自于您在同一档案中使用FileOutputStreamFileInputStream这一事实。

我建议在ByteArrayOutputStream上保存pdf,关闭压模,然后将ByteArrayOutputStream保存到文件中。

我使用IOUtils.write(byte[] data, OutputStream output)方法将ByteArrayOutputStream保存在FileOutputStream中。

我测试了这个并且它有效:

    String in = "Original.pdf";
    String out = "Original.pdf";

    PdfReader reader = new PdfReader(in);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfStamper stamper = new PdfStamper(reader, baos );

    int totalPages = reader.getNumberOfPages();
    stamper.insertPage(totalPages + 1, PageSize.A4);
    stamper.addAnnotation(PdfAnnotation.createText(stamper.getWriter(), new Rectangle(30f, 750f, 80f, 800f), "inserted page", "This page is the title page.", true, null),
            reader.getNumberOfPages());
    stamper.close();

    FileOutputStream fileOutputStream = new FileOutputStream(out);
    IOUtils.write(baos.toByteArray(), fileOutputStream);

答案 1 :(得分:0)

那么你可以做这样的事情。

            String out="Original.pdf";
            File oldFile = new File(out);
            try {
                Document document = new Document();
                PdfCopy filePdfCopy = new PdfCopy(document,
                        new FileOutputStream(oldFile, true));
                document.open();
                PdfReader reader = new PdfReader(newFile.getAbsolutePath());
                PdfReader reader_old = new PdfReader(
                        oldFile.getAbsolutePath());
                filePdfCopy.addDocument(reader);
                filePdfCopy.addDocument(reader_old);
                filePdfCopy.close();
                reader.close();
                reader_old.close();
                document.close();
                stats.addMergedPdf();
            } catch (FileNotFoundException e) {
                logger.error("FileNotFoundException: ", e);
                stats.addError();
            } catch (DocumentException e) {
                logger.error("DocumentException: ", e);
                stats.addError();
            } catch (IOException e) {
                logger.error("IOException: ", e);
                stats.addError();
            }