itext合并A4的pdf为A3版式

试卷生成A3板式, 源文件为A4

  • 使用itext实现

maven坐标

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
 <dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itextpdf</artifactId>
     <version>5.5.13.1</version>
 </dependency>
/**
     * 两页打印到一页
     * @param streamOfPDFFile
     * @param outputStream
     * @param paginate
     */
    public static void concatPDFs(InputStream streamOfPDFFile, OutputStream outputStream, boolean paginate) {

        Document document = new Document();
        try {

            //读取PDF
            InputStream pdf = streamOfPDFFile;
            PdfReader pdfReader = new PdfReader(pdf);
            int totalPages = pdfReader.getNumberOfPages();

            //创建PDF Writer
            PdfWriter writer = PdfWriter.getInstance(document, outputStream);
            document.open();
            BaseFont baseFont = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            PdfContentByte contentByte = writer.getDirectContent();

            Rectangle rec = pdfReader.getPageSize(1);
            //新pdf为两个宽度
            Rectangle newRec = new Rectangle(0, 0, rec.getWidth() * 2, rec.getHeight());
            document.setPageSize(newRec);

            PdfImportedPage page;
            PdfImportedPage page2;
            int currentPageNumber = 0;

            //舍弃奇数的最后一页, 删除该设置后面不受影响
            totalPages = totalPages >> 1 << 1;
            for (int pageIndex = 0; pageIndex < totalPages; pageIndex += 2) {
                document.newPage();
                currentPageNumber++;

                //原始第一页设置到左边
                page = writer.getImportedPage(pdfReader, pageIndex + 1);
                contentByte.addTemplate(page, 0, 0);

                //第二页设置到右边
                if (pageIndex + 2 <= totalPages) {
                    page2 = writer.getImportedPage(pdfReader, pageIndex + 2);
                    contentByte.addTemplate(page2, rec.getWidth(), 0);
                }

                //设置页码
                if (paginate) {
                    contentByte.beginText();
                    contentByte.setFontAndSize(baseFont, 13);
                    contentByte.showTextAligned(PdfContentByte.ALIGN_CENTER, "" + currentPageNumber + "/" + (totalPages / 2 + (totalPages % 2 == 0 ? 0 : 1)), newRec.getWidth() / 2, 17, 0);
                    contentByte.endText();
                }
            }

            outputStream.flush();
            document.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document.isOpen())
                document.close();
            try {
                if (outputStream != null)
                    outputStream.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值