java的PDF纵横向打印

时间:2022-11-22 10:27:24

PDF默认是纵向打印的,通过rotate()来让其改变为横向打印,一般在打印A4 12*21纸以及发票的时候会用横向打印。横向打印时页面会出现行转列以及列转行的情况,因此在设置页面大小的时候一定要宽度设置的宽一些,表格的maxWidth设置在500到600之间就行了,不然会打印的表格就会不是太全或者很少。如果你是纵向打印,那么Rectangle设置页面大小就可以根据实际情况设置了。下面附上代码:

package com.ucfgroup.framework.web.app.company.service.process.pdf.pzPrint;

import java.io.File;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.ucfgroup.framework.utils.DateUtil;
import com.ucfgroup.framework.utils.NumberUtil;
import com.ucfgroup.framework.utils.Rmb;
import com.ucfgroup.framework.web.app.company.entity.CAccvouchAndDetail;
import com.ucfgroup.framework.web.app.company.entity.CUserZt;

public class PDFPrint {
Rectangle pageSize = new Rectangle(1000,730);
Document document = new Document(pageSize);// 建立一个Document对象

private static Font headfont;// 设置字体大小
private static Font keyfont;// 设置字体大小
private static Font textfont;// 设置字体大小
private static Font textfontHead;// 设置字体大小
private static int fm = 0;// 凭证号:记-后面的分母
private static int jcount = 0;// 凭证号:记-后面的分子
@SuppressWarnings("unused")
private static int pageNumber = 0;// 当前页
@SuppressWarnings("unused")
private static int totalPage = 0;// 总页数
private static int totalXhCount = 0;// 总共循环次数
BigDecimal totalJfh = BigDecimal.ZERO;//合计借方和
BigDecimal totalDfh = BigDecimal.ZERO;//合计贷方和
BigDecimal morepageTotalJF=BigDecimal.ZERO;//计算凭证分页时候的总和

static {
BaseFont bfChinese;
try {
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
headfont = new Font(bfChinese, 19, Font.BOLD);// 设置字体大小
keyfont = new Font(bfChinese, 15, Font.BOLD);// 设置字体大小
textfont = new Font(bfChinese, 10, Font.NORMAL);// 设置字体大小
textfontHead = new Font(bfChinese, 11, Font.NORMAL);// 设置字体大小
} catch (Exception e) {
e.printStackTrace();
}
}

public PDFPrint(File file,int totalXhCountp,int pageNumberp,int totalPagep,int fmp ,int jcountp) {
totalXhCount = totalXhCountp;
pageNumber = pageNumberp;
fm = fmp;
jcount = jcountp;
document.setPageSize(pageSize.rotate());// 设置页面大小
document.setMargins(60, 50, 30, 10);
try {
PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
} catch (Exception e) {
e.printStackTrace();
}

}

int maxWidth = 630;

public PdfPCell createCell(String value, com.itextpdf.text.Font font, int align, int width) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setPhrase(new Phrase(value, font));
cell.setPaddingBottom(3);
cell.setPaddingTop(3);
// cell.setFixedHeight(35);
return cell;
}

public PdfPCell createCell(String value, com.itextpdf.text.Font font, int width) {
PdfPCell cell = new PdfPCell();
cell.setPhrase(new Phrase(value, font));
cell.setPaddingBottom(11);
cell.setPaddingTop(11);
// cell.setFixedHeight(35);
return cell;
}

public PdfPCell createCell(String value, com.itextpdf.text.Font font) {
PdfPCell cell = new PdfPCell();
cell.setPhrase(new Phrase(value, font));
cell.setPaddingBottom(11);
cell.setPaddingTop(11);
return cell;
}

public PdfPCell createCell(String value, com.itextpdf.text.Font font, int align, int colspan, boolean boderFlag,
int width) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setColspan(colspan);
cell.setPhrase(new Phrase(value, font));
cell.setPadding(3.0f);
if (!boderFlag) {
cell.setBorder(0);
// cell.setPaddingBottom(-50);
}
cell.setFixedHeight(30);
return cell;
}

public PdfPCell createCell(String value, com.itextpdf.text.Font font, int align, int colspan, boolean boderFlag) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setColspan(colspan);
cell.setPhrase(new Phrase(value, font));
cell.setPadding(3.0f);
if (!boderFlag) {
cell.setBorder(0);
}
cell.setFixedHeight(30);
if(value.contains("凭证号:记-")){
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
// cell.setPaddingLeft(-5);
}
return cell;
}

public PdfPCell createCell(String value, com.itextpdf.text.Font font, int align, int colspan, boolean boderFlag,
String flag) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_LEFT);
cell.setHorizontalAlignment(align);
cell.setColspan(colspan);
cell.setPhrase(new Phrase(value, font));
cell.setPadding(3.0f);
if (!boderFlag) {
cell.setBorder(0);
cell.setPaddingTop(15.0f);
cell.setPaddingBottom(8.0f);
}
cell.setPaddingTop(8);
cell.setPaddingLeft(-2);
if(flag.equals("3")){
cell.setPaddingLeft(-50);
}
if(flag.equals("4")){
cell.setPaddingLeft(-30);
}
return cell;
}

public PdfPTable createTable(int colNumber) {
PdfPTable table = new PdfPTable(colNumber);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
}
return table;
}

public PdfPTable createTable(float[] widths) {
PdfPTable table = new PdfPTable(widths);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
}
return table;
}

public PdfPTable createBlankTable() {
PdfPTable table = new PdfPTable(1);
table.getDefaultCell().setBorder(0);
table.addCell(createCell("", keyfont));
table.setSpacingAfter(20.0f);
table.setSpacingBefore(20.0f);
return table;
}

public void generatePDF(HttpServletRequest request, List<CAccvouchAndDetail> list) throws Exception {
int count = 0;
CUserZt zt = (CUserZt) request.getSession().getAttribute("ZTModel");
BigDecimal total = BigDecimal.ZERO;
BigDecimal totalJf = BigDecimal.ZERO;
BigDecimal totalDf = BigDecimal.ZERO;
int caccno = list.get(0).getCaccno();
String caccnoStr = "" + caccno;
if (caccno < 10) {
caccnoStr = "00" + caccno;
}
if (caccno >= 10 && caccno < 100) {
caccnoStr = "0" + caccno;
}
if (fm > 1) {
caccnoStr += "-" + jcount + "/" + fm;
}
PdfPTable table = createTable(4);
table.setWidths(new float[] { 0.22f, 0.42f, 0.18f, 0.18f });// 每个单元格占多宽

PdfPCell createCellp = createCell("yyyy", headfont, Element.ALIGN_CENTER, 1, false, 258);
createCellp.setPaddingLeft(25);

table.addCell(createCell("", headfont, Element.ALIGN_CENTER, 1, false, 202));
table.addCell(createCellp);
table.addCell(createCell("", headfont, Element.ALIGN_CENTER, 1, false, 115));
table.addCell(createCell("附单据数:" + list.get(0).getcFj(), keyfont, Element.ALIGN_RIGHT, 1, false, 115));

table.addCell(createCell(zt.getZtname(), textfontHead, Element.ALIGN_LEFT, 1, false));
table.addCell(createCell("日期:" + DateUtil.dateToString(list.get(0).getCdate(), "yyyy-MM-dd"), textfontHead,
Element.ALIGN_CENTER, 1, false));
// table.addCell(createCell(" ", textfontHead, Element.ALIGN_CENTER, 1, false));
PdfPCell caccnoCell = createCell("凭证号:记-" + caccnoStr, textfontHead, Element.ALIGN_RIGHT, 2, false);
table.addCell(caccnoCell);

PdfPCell createDigestCell = createCell("摘要", keyfont, Element.ALIGN_CENTER, 202);
createDigestCell.setBorderWidthLeft(1.5f);
createDigestCell.setBorderWidthTop(1.5f);
createDigestCell.setBorderWidthBottom(1.5f);
createDigestCell.setFixedHeight(25);

PdfPCell createSubjectCell = createCell("科目名称", keyfont, Element.ALIGN_CENTER, 258);
createSubjectCell.setBorderWidthTop(1.5f);
createSubjectCell.setBorderWidthBottom(1.5f);
createSubjectCell.setFixedHeight(25);

PdfPCell createJfCell = createCell("借方", keyfont, Element.ALIGN_CENTER, 115);
createJfCell.setBorderWidthTop(1.5f);
createJfCell.setBorderWidthBottom(1.5f);
createJfCell.setFixedHeight(25);

PdfPCell createDfCell = createCell("贷方", keyfont, Element.ALIGN_CENTER, 115);
createDfCell.setBorderWidthTop(1.5f);
createDfCell.setBorderWidthBottom(1.5f);
createDfCell.setBorderWidthRight(1.5f);
createDfCell.setFixedHeight(25);

table.addCell(createDigestCell);
table.addCell(createSubjectCell);
table.addCell(createJfCell);
table.addCell(createDfCell);

for (CAccvouchAndDetail cAccvouchAndDetail : list) {
PdfPCell createDigestTextLeftCell = createCell(cAccvouchAndDetail.getCdigest(), textfont, 202);
createDigestTextLeftCell.setBorderWidthLeft(1.5f);

table.addCell(createDigestTextLeftCell);
table.addCell(createCell(cAccvouchAndDetail.getCcodename(), textfont, 258));

PdfPCell createCellj = createCell(judgeMoney(cAccvouchAndDetail.getcJf()), textfont, 115);
createCellj.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCellj.setHorizontalAlignment(Element.ALIGN_RIGHT);

PdfPCell createCelld = createCell(judgeMoney(cAccvouchAndDetail.getcDf()), textfont, 115);
createCelld.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCelld.setHorizontalAlignment(Element.ALIGN_RIGHT);
createCelld.setBorderWidthRight(1.5f);

table.addCell(createCellj);
table.addCell(createCelld);
total = total.add(cAccvouchAndDetail.getcJf() == null ? BigDecimal.ZERO : cAccvouchAndDetail.getcJf());
totalJf = totalJf.add(cAccvouchAndDetail.getcJf() == null ? BigDecimal.ZERO : cAccvouchAndDetail.getcJf());//借方合计 ---
totalDf = totalDf.add(cAccvouchAndDetail.getcDf() == null ? BigDecimal.ZERO : cAccvouchAndDetail.getcDf());//贷方合计 ---
count += 1;
}
//借方和贷方和的累加 --
for(;totalXhCount<jcount;){
totalJfh = totalJfh.add(totalJf);
totalDfh = totalDfh.add(totalDf);
break;
}
for (int i = count + 1; i < 6; i++) {
PdfPCell leftBlankCell = createCell(" ", textfont, 202);
leftBlankCell.setBorderWidthLeft(1.5f);
table.addCell(leftBlankCell);
table.addCell(createCell(" ", textfont, 258));
table.addCell(createCell(" ", textfont, 115));
PdfPCell rightBlankCell = createCell(" ", textfont, 115);
rightBlankCell.setBorderWidthRight(1.5f);
table.addCell(rightBlankCell);
}

if (total.compareTo(BigDecimal.ZERO) != 0||
totalJf.compareTo(BigDecimal.ZERO) != 0 ||
totalDf.compareTo(BigDecimal.ZERO) != 0) {
if(jcount > 0 && jcount < fm ){//当凭证为多页
PdfPCell createCelln = createCell("合计:", textfontHead, Element.ALIGN_RIGHT);
createCelln.setColspan(2);
createCelln.setPaddingLeft(4);
createCelln.setPaddingBottom(0);
createCelln.setPaddingTop(0);
createCelln.setFixedHeight(17);
createCelln.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCelln.setBorderWidthLeft(1.5f);
createCelln.setBorderWidthTop(1.5f);
createCelln.setBorderWidthBottom(1.5f);
table.addCell(createCelln);
//添加借方金额到表格
PdfPCell createCellJf = createCell(judgeMoney(totalJf), textfontHead,115);
createCellJf.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCellJf.setHorizontalAlignment(Element.ALIGN_RIGHT);
createCellJf.setBorderWidthTop(1.5f);
createCellJf.setBorderWidthBottom(1.5f);

table.addCell(createCellJf);

//添加贷方金额到表格
PdfPCell createCellDf = createCell(judgeMoney(totalDf), textfontHead,115);
createCellDf.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCellDf.setHorizontalAlignment(Element.ALIGN_RIGHT);
createCellDf.setBorderWidthRight(1.5f);
createCellDf.setBorderWidthTop(1.5f);
createCellDf.setBorderWidthBottom(1.5f);
table.addCell(createCellDf);
}
if(jcount == fm ){//当凭证为最后一页时

PdfPCell createCell = createCell("合计:" + Rmb.CmycurD(morepageTotalJF.toString()), textfont,
Element.ALIGN_LEFT);
createCell.setColspan(2);
createCell.setPaddingLeft(4);
createCell.setPaddingBottom(0);
createCell.setPaddingTop(0);
createCell.setFixedHeight(17);
createCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCell.setBorderWidthLeft(1.5f);
createCell.setBorderWidthTop(1.5f);
createCell.setBorderWidthBottom(1.5f);
table.addCell(createCell);

PdfPCell createCellJfs = createCell(judgeMoney(morepageTotalJF), textfont,115);
createCellJfs.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCellJfs.setHorizontalAlignment(Element.ALIGN_RIGHT);
createCellJfs.setBorderWidthTop(1.5f);
createCellJfs.setBorderWidthBottom(1.5f);

table.addCell(createCellJfs);

PdfPCell createCellDfs = createCell(judgeMoney(morepageTotalJF), textfont,115);
createCellDfs.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCellDfs.setHorizontalAlignment(Element.ALIGN_RIGHT);
createCellDfs.setBorderWidthRight(1.5f);
createCellDfs.setBorderWidthTop(1.5f);
createCellDfs.setBorderWidthBottom(1.5f);

table.addCell(createCellDfs);

morepageTotalJF=BigDecimal.ZERO;//清除上次的凭证分页金额总和
}
if (jcount == 0 && fm == 1) {//当凭证只有一页
PdfPCell createCell = createCell("合计:" + Rmb.CmycurD(total.toString()), textfont, Element.ALIGN_LEFT);
createCell.setColspan(2);
createCell.setPaddingLeft(4);
createCell.setPaddingBottom(0);
createCell.setPaddingTop(0);
createCell.setFixedHeight(17);
createCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCell.setBorderWidthLeft(1.5f);
createCell.setBorderWidthTop(1.5f);
createCell.setBorderWidthBottom(1.5f);
table.addCell(createCell);

PdfPCell createCellJf = createCell(judgeMoney(totalJf), textfont,115);
createCellJf.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCellJf.setHorizontalAlignment(Element.ALIGN_RIGHT);
createCellJf.setBorderWidthTop(1.5f);
createCellJf.setBorderWidthBottom(1.5f);

table.addCell(createCellJf);

PdfPCell createCellDf = createCell(judgeMoney(totalDf), textfont,115);
createCellDf.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCellDf.setHorizontalAlignment(Element.ALIGN_RIGHT);
createCellDf.setBorderWidthTop(1.5f);
createCellDf.setBorderWidthBottom(1.5f);
createCellDf.setBorderWidthRight(1.5f);

table.addCell(createCellDf);
}
} else {
PdfPCell createCell = createCell("合计:", textfont, Element.ALIGN_LEFT);
createCell.setColspan(2);
createCell.setPaddingLeft(4);
createCell.setPaddingBottom(0);
createCell.setPaddingTop(0);
createCell.setFixedHeight(17);
createCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
createCell.setBorderWidthTop(1.5f);
createCell.setBorderWidthBottom(1.5f);
createCell.setBorderWidthLeft(1.5f);
table.addCell(createCell);

table.addCell(createCell(" ", keyfont, Element.ALIGN_CENTER,115));
PdfPCell createSumCell = createCell(" ", keyfont, Element.ALIGN_CENTER,115);
table.addCell(createSumCell);
createSumCell.setBorderWidthTop(1.5f);
createSumCell.setBorderWidthBottom(1.5f);
createSumCell.setBorderWidthRight(1.5f);
}

String shrName = zt.getShrName() == null ? "" : zt.getShrName();
String zdrName = zt.getZdrName() == null ? "" : zt.getZdrName();
String zgrName = zt.getZgName() == null ? "" : zt.getZgName();

table.addCell(createCell("xxxx:" + zdrName, textfont, Element.ALIGN_LEFT, 1, false, "1"));
table.addCell(createCell("xxxx:", textfont, Element.ALIGN_LEFT, 1, false, "2"));
table.addCell(createCell("xxxx:"+shrName, textfont, Element.ALIGN_LEFT, 1, false, "3"));
table.addCell(createCell("xxxx:" + zgrName, textfont, Element.ALIGN_LEFT, 1, false, "4"));

document.add(table);

// // 创建Chunk对象,设置下划线的厚度为1
// Chunk strike = new Chunk("");
// strike.setUnderline(1f, 3f);
// document.add(strike);
}

public void printPdf(HttpServletRequest request, Map<String,
List<CAccvouchAndDetail>> map, List<String> aidList,int
fmp,int jcountp)
throws Exception {
fm = fmp;
jcount = jcountp;
int mapSize = aidList.size();
int mapYs = mapSize % 2;
if (mapYs > 0) {
totalPage = mapSize / 2 + 1;
} else {
totalPage = mapSize / 2;
}
for (String aid : aidList) {
List<CAccvouchAndDetail> list = map.get(aid);
Map<Integer, List<CAccvouchAndDetail>> cfListMap = new HashMap<Integer, List<CAccvouchAndDetail>>();
int size = list.size();
int cs = size / 5;
int ys = size % 5;
if (cs > 1) {
if (ys > 0) {
fm = cs + 1;
} else {
fm = cs;
}
}
if (cs == 1 && ys > 0) {
fm = 2;
}
if (size > 5) {
int count = 0;
int jsq = 0;// 计数器
for (CAccvouchAndDetail cAccvouchAndDetail : list) {
morepageTotalJF = morepageTotalJF.add(cAccvouchAndDetail.getcJf());
List<CAccvouchAndDetail> tempList = cfListMap.get(count);
if (null == tempList || jsq == 5) {
jsq = 0;
tempList = new ArrayList<CAccvouchAndDetail>();
tempList.add(cAccvouchAndDetail);
count += 1;
cfListMap.put(count, tempList);
jsq += 1;
} else {
tempList.add(cAccvouchAndDetail);
jsq += 1;
}
}
jcount = 0;
for (int i = 0; i < fm; i++) {
List<CAccvouchAndDetail> cfList = cfListMap.get(i + 1);
jcount += 1;
generatePDF(request, cfList);
document.newPage();
totalXhCount += 1;
}
} else {
fm = 1;
jcount = 0;
generatePDF(request, list);
document.newPage();
totalXhCount += 1;
}

}
document.close();
}

public static String leftPad(String str, int i) {
int addSpaceNo = i - str.length();
String space = "";
for (int k = 0; k < addSpaceNo; k++) {
space = " " + space;
}
;
String result = space + str;
return result;
}

private String judgeMoney(BigDecimal bd) {
String temp = "";
if(bd != null && bd.compareTo(BigDecimal.ZERO) != 0){
temp = NumberUtil.msStrAddComma(NumberUtil.msBigDecimalFormat(bd));
}
return temp;
}
}