问题
I have created an application using JodConverter
and Open-Office
for converting an excel(.xlsx
) to PDF
, The application works fine but i am facing two problems
The pages of output PDF is in the form of A4 size, since because of that certain worksheet content have been sliced off. since i want each worksheet of the excel as complete as in one page what ever the size.
The no of worksheets were missing, say if my excel has 8 worksheet i am getting only two or three within the
PDF
output
Even if we tried to convert to pdf
directly from open-office, its giving the above similar issues
Excel File - ss1.xlsx
Output PDF - work.pdf
can anyone please tell me some solution for this
My code is as given below
public class MyConverter {
public static void main(String[] args) throws ConnectException {
File inputFile = new File("C:/Users/Work/Desktop/ss1.xlsx");
File outputFile = new File("C:/Users/Work/Desktop/work.pdf");
// connect to an OpenOffice.org instance running on port 8100
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);
// close the connection
connection.disconnect();
}
回答1:
I used the (free) PrimoPDF printer driver to create the PDF directly from within Excel. The large number of pages (20+) is due to the fact that the 'fit to page' print option is missing in one of the worksheets, the 3rd if i remember well. After correcting this, the command to print all worksheets still results in 2 PDF files to be generated. PrimoPDF asks twice for a file name while it should ask only one. I assume your program just generates the PDF corresponding to the first part since normally only one PDF should be generated. I have no explanation for the 2-part printing. It might be due to some print setting in one of the worksheets that forces the printing to be performed in 'two batches'. For instance, a different resolution value may prevent printing in one batch. Conclusion: the workaround is to print with PrimoPDF and concatenate the 2 PDF files using one of the freely available programs on the web. For a durable solution you'll have to verify the print settings of all worksheets in detail and make sure they are equal.
回答2:
I'm afraid my previous answer was not clear enough. So here is the essence:
- All your worksheets except the 3rd have a resolution setting of 600. In the 3rd sheet the resolution is left blank
- Change the resolution of the 3rd sheet to 600
- The PDF file will now be generated normally, containing all sheets.
Apparently Excel can only produce PDFs where the page resolutions of all worksheets are the same. If it encounters a sheet with different (of blank) resolution it just stops producing output without giving any warning. IMHO this is a bug in Excel. Fortunately the workaround is easy.
Hope this clarifies my previous answer.
回答3:
You can use Microsoft Excel to do any .xlsx conversions to PDF, I am currently developing an application that uses Jacob, (Java Com Bridge) a thin wrapper for connecting to the Object Models of Microsoft Office Programs, afaik it doesn't support open-office, but it does a good job at converting your .xlsx file to a PDF file. It requires a bit of setting up. Link to Jacob
When looking into the problem I found in Excel -> Page Setup, if you change Fit to 1 pages wide and 1 pages tall, it squeezes each work sheet to fit on each page in PDF. Another problem I ran into was the wrap text property, be careful when you use it, as it can cause layout issues.
I made a small implementation of this, tested on Excel 2010 and Jacob 1.18
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComFailException;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class ExcelApplication {
private final String APP_NAME = "Excel.Application";
private final ActiveXComponent excelApplication;
private Dispatch workbooks;//all active workbooks opened
private Dispatch activeWorkbook;//active workbook
private Dispatch activeWorksheets;//all worksheets in active workbook
public ExcelApplication() {
excelApplication = new ActiveXComponent(APP_NAME);
}
public void openExcelFileInvisible(String fileName) {
//Opens Excel in the background
String fileUrl;
if (excelApplication != null) {
excelApplication.setProperty("Visible", new Variant(false));//sets excel invisible
//file url relative to this class
//or you can just give an absolute path
fileUrl = getClass().getResource(fileName).toExternalForm();
//get workbooks
workbooks = Dispatch.call(excelApplication, "Workbooks").getDispatch();
if (activeWorkbook == null) {
try {
activeWorkbook = Dispatch.call(workbooks, "Open", fileUrl).getDispatch();
} catch (ComFailException comFailEx) {
//error opening the Excel Document
}
}
}
}
public void closeActiveWorkbookAndSave() {
try {
//close and save change's to active workbook
//this only closes the workbook, not Excel
Dispatch.call(activeWorkbook, "Close", new Variant(true));
//if you want to exit the Excel App.
//excelApplication.invoke("Quit", new Variant[0]);
} catch (ComFailException cfe) {
//problem closing the workbook
}
}
public void convert_XLSX_TO_PDF(String pdfFileName) {
if (activeWorkbook != null) {
String workbookName = Dispatch.call(activeWorkbook, "Name").getString();
activeWorksheets = Dispatch.call(activeWorkbook, "Worksheets").getDispatch();
int workSheetCount = Dispatch.call(activeWorksheets, "Count").getInt();
System.out.println("Workbook Name =" + workbookName);
System.out.println("Total Worksheets In Active Document = " + workSheetCount);
System.out.println("Converting to PDF....");
try {
Dispatch currentWorksheet;
String currentWorksheetName;
//worksheets not zero based, starts at one
for (int i = 1; i < workSheetCount+1; i++) {
//get each active work sheet and set up the page setup settings
currentWorksheet = Dispatch.call(activeWorksheets, "Item", new Variant(i)).getDispatch();
currentWorksheetName = Dispatch.call(currentWorksheet, "Name").getString();
System.out.println("Setting up page setup for Workbook Sheet ("+ i + ".) - " + currentWorksheetName);
//Get page setup for each worksheet
Dispatch pageSetup = Dispatch.get(currentWorksheet, "PageSetup").getDispatch();
/**** Zoom must be set to false for FitToPagesWide and FitToPagesTall
to take control of scaling
*/
Dispatch.put(pageSetup, "Zoom", new Variant(false));
//Fit content on each worksheet to fit in a single page
Dispatch.put(pageSetup, "FitToPagesWide", new Variant(1));
Dispatch.put(pageSetup, "FitToPagesTall", new Variant(1));
//set print area to not chop off content
Dispatch.put(pageSetup, "PrintArea", new Variant(false));
//set left margin small
Dispatch.put(pageSetup, "LeftMargin", new Variant(0));
}
//[3rd param] = 0 specifies PDF document, 1 is XPS format
//[4th param] = 0 specifies high quality, 1 is low quality
//[5th param] = true to keep document properties, false to ommit
//[6th param] = true to keep print areas set, false does not keep print areas set
Dispatch.call(activeWorkbook, "ExportAsFixedFormat", new Variant(0), new Variant(pdfFileName), new Variant(0), new Variant(false), new Variant(true));
System.out.println("Export to PDF has been successful.");
//close and save
closeActiveWorkbookAndSave();
} catch (ComFailException comFailEx) {
//Export Failed
System.out.println("Export to PDF has failed");
}
}
}
}
public class TestExcel {
public static void main(String[] args) {
// TODO code application logic here
ExcelApplication e = new ExcelApplication();
e.openExcelFileInvisible("ss1.xlsx");
//full path accepted here or if not it will be exported to current directory
e.convert_XLSX_TO_PDF("covertedXLSXFile.pdf");
}
}
Here is the PDF File generated from the above code. Notice the 3rd page, the content is a bit chopped off, when you remove the wrap text property and merged cells, it generates fine. Converted XLSX
回答4:
This is the Excel VBA code to set up the same page parameters for all worksheets. Sorry i'm not familiar with Openoffice programming, assume that the API is similar:
Sub PageSetup_AllSheets()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
ws.Activate
Setup_Page
Next
End Sub
Sub Setup_Page()
'
' Setup_Page Macro
' Macro recorded 27/08/2014 by Paul
'
With ActiveSheet.PageSetup
.PrintTitleRows = ""
.PrintTitleColumns = ""
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = ""
.LeftMargin = Application.InchesToPoints(0.7)
.RightMargin = Application.InchesToPoints(0.7)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintQuality = -3
.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlPortrait
.Draft = False
.PaperSize = xlPaperA4
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintErrors = xlPrintErrorsDisplayed
End With
End Sub
来源:https://stackoverflow.com/questions/24270546/missing-worksheets-and-page-size-issue-when-excel-xlsx-convert-to-pdf-pdf