1、maven注入连接openoffice的Jar和poi
com.artofsolving
jodconverter
2.2.1
org.apache.poi
poi
3.15
org.apache.poi
poi-ooxml
3.15
org.apache.poi
poi-scratchpad
3.15
2.根据文件输入流获取excel文件的宽度
public InputStream getPdfStream(String fileEnd, InputStream fileInput, String last) throws Exception{
String fileType = "";
Integer colWidth = 0;
if("xlsx".equals(fileEnd) || "xls".equals(fileEnd)) { //xlsx格式的文件转成xls处理
ByteArrayOutputStream baos = getByteArrayStream(fileInput); //把输入流转成输出数组的方法
fileInput = new ByteArrayInputStream(baos.toByteArray());
InputStream streamClon = new ByteArrayInputStream(baos.toByteArray());
colWidth = getColumnWidth(streamClon,fileEnd); //获取excel有数据的列数
fileType = "xls";
}else if("docx".equals(fileEnd)){ //docx格式的文件转成doc处理
fileType = "doc";
}else {
fileType = fileEnd;
}
try {
System.out.println("列宽为:"+colWidth);
OpenOfficeConnection connection = OpenOfficeUtils.getInstance();
ConverterDocument converter = new ConverterDocument(connection,fileType,colWidth); //使用StreamOpenOfficeDocumentConverter可以转07版的
//DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection); //使用StreamOpenOfficeDocumentConverter可以转07版的
DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry(); //jar包里的类
DocumentFormat inputFormat = formatReg.getFormatByFileExtension(fileType); //源文件的格式
DocumentFormat pdfFormat = formatReg.getFormatByFileExtension("pdf"); //转成的格式
ByteArrayOutputStream pdfstream = new ByteArrayOutputStream(); //保存转成pdf的流的数组
converter.convert(fileInput, inputFormat, pdfstream, pdfFormat); //将文件流转换成pdf流
InputStream pdfInput = new BufferedInputStream(new ByteArrayInputStream(pdfstream.toByteArray()));//把pdf流转成输入流
pdfstream.flush();
pdfstream.close();
if("true".equals(last)) {
OpenOfficeUtils.closeConnection();
}
return pdfInput;
} catch(Exception e) {
OpenOfficeUtils.closeConnection();
e.printStackTrace();
}
return null;
}
private ByteArrayOutputStream getByteArrayStream(InputStream fileInput) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = fileInput.read(buffer)) > -1 ) {
baos.write(buffer, 0, len);
}
baos.flush();
return baos;
}
private Integer getColumnWidth(InputStream fileInput,String fileEnd) throws Exception {
Workbook workBook = getWorkBook(fileInput,fileEnd);
int colWidth = 0;
if(workBook!=null) {
Sheet sheet = workBook.getSheetAt(0);
if(sheet != null){
int colNum = sheet.getRow(1).getPhysicalNumberOfCells();
for(int i = 0;i < colNum;i++) {
colWidth += sheet.getColumnWidth(i);
}
}
}
workBook.close();
return colWidth;
}
public Workbook getWorkBook(InputStream in,String fileEnd) throws Exception {
Workbook workbook = null;
try {
if(fileEnd.equals("xls")){ //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
workbook = new HSSFWorkbook(in);
}else if(fileEnd.equals("xlsx")){ //2007 及2007以上
workbook = new XSSFWorkbook(in); //2003
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return workbook;
}
3.重写连接Openoffice的方法,重写refreshDocument方法,根据excel文件的大小设置页面大小
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
import com.sun.star.awt.Size;
import com.sun.star.beans.PropertyValue;
import com.sun.star.lang.XComponent;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.view.PaperFormat;
import com.sun.star.view.XPrintable;
public class ConverterDocument extends StreamOpenOfficeDocumentConverter {
private String fileType;
private Integer colWidth;
public ConverterDocument(OpenOfficeConnection connection, String fileType, Integer colWidth) {
super(connection);
this.colWidth = colWidth;
this.fileType = fileType;
}
public final static Size A4, A3, A2,A1;
public final static Size B4, B3, B2,B1;
public final static Size KaoqinReport;
static {
A4 = new Size(21000, 29700);
A3 = new Size(29700, 42000);
A2 = new Size(42000, 59400);
A1 = new Size(60000, 90000);
B4 = new Size(25000, 35300);
B3 = new Size(35300, 50000);
B2 = new Size(50000, 70700);
B1 = new Size(70700, 100000);
KaoqinReport = new Size(42000, 54300);
}
/*
* XComponent:xCalcComponent
*
* @seecom.artofsolving.jodconverter.openoffice.converter.
* AbstractOpenOfficeDocumentConverter
* #refreshDocument(com.sun.star.lang.XComponent)
*/
@Override
protected void refreshDocument(XComponent document) {
super.refreshDocument(document);
// The default paper format and orientation is A4 and portrait. To
// change paper orientation
// re set page size
XPrintable xPrintable = (XPrintable) UnoRuntime.queryInterface(XPrintable.class, document);
PropertyValue[] printerDesc = new PropertyValue[3];
printerDesc[0] = new PropertyValue();
printerDesc[0].Name = "PaperFormat";
printerDesc[0].Value = PaperFormat.USER;
// Paper Size
printerDesc[1] = new PropertyValue();
printerDesc[1].Name = "PaperSize";
if("xls".equals(fileType)) {
if(colWidth <= 21000) {
printerDesc[1].Value = A4;
}else if(colWidth > 21000 && colWidth <= 29700) {
printerDesc[1].Value = A3;
}else if(colWidth > 29700 && colWidth <= 42000) {
printerDesc[1].Value = A2;
}else if(colWidth > 42000 && colWidth <= 60000) {
printerDesc[1].Value = A1;
}else {
printerDesc[1].Value = A4;
}
}else {
printerDesc[1].Value = A4;
}
printerDesc[2] = new PropertyValue();
printerDesc[2].Name = "Pages";
printerDesc[2].Value = 2;
try {
xPrintable.setPrinter(printerDesc);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.向存储地址输出pdf文件流,此用minio
ByteArrayOutputStream arrayStream = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len;
while ((len = inputStream.read(b)) > 0) {
arrayStream.write(b, 0, len);
}
arrayStream.flush();
InputStream returnStream = new BufferedInputStream(new ByteArrayInputStream(arrayStream.toByteArray())); //把output流数组转成input流
minioClient.putObject(fileDirectory,pathPdf, returnStream,returnStream.available(),"application/octet-stream");
System.out.println("文件"+pathPdf+"转成功==========================");