试卷生成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();
}
}
}