我使用JodConverter
和Open-Office
创建了一个应用程序,用于将excel(.xlsx
)转换为PDF
,应用程序正常但我遇到了两个问题
输出PDF的页面是A4大小的形式,因为某些工作表内容已被切掉。因为我希望excel的每个工作表都像在一个页面中一样完整。
缺少工作表,如果我的Excel有8个工作表,我只能在PDF
输出中获得两个或三个
即使我们尝试直接从开放办公室转换为pdf
,它也会提出上述类似问题
Excel文件 - ss1.xlsx
输出PDF - work.pdf
任何人都可以告诉我一些解决方案吗
我的代码如下所示
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();
}
答案 0 :(得分:2)
我使用(免费)PrimoPDF打印机驱动程序直接在Excel中创建PDF。 大量的页面(20+)是由于其中一个工作表中缺少“适合页面”打印选项的事实,如果我记得很清楚则是第3页。 更正后,打印所有工作表的命令仍然会生成2个PDF文件。 PrimoPDF要求两次输入文件名,而它只要求一个。 我假设您的程序只生成与第一部分对应的PDF,因为通常只生成一个PDF。我对2部分打印没有解释。这可能是由于其中一个工作表中的某些打印设置迫使打印以“两批”执行。例如,不同的分辨率值可能会阻止一批打印。 结论:解决方法是使用PrimoPDF进行打印,并使用Web上免费提供的程序连接2个PDF文件。对于持久的解决方案,您必须详细验证所有工作表的打印设置,并确保它们相同。
答案 1 :(得分:2)
我担心我以前的答案不够明确。所以这就是本质:
显然,Excel只能生成所有工作表的页面分辨率相同的PDF。如果遇到具有不同(空白)分辨率的工作表,它只会停止生成输出而不发出任何警告。恕我直言这是Excel中的一个错误。幸运的是,解决方法很简单。
希望这能澄清我以前的答案。
答案 2 :(得分:1)
您可以使用Microsoft Excel对PDF进行任何.xlsx转换,我目前正在开发一个使用Jacob的应用程序(Java Com Bridge),它是一个用于连接Microsoft Office程序的对象模型的瘦包装器,但它没有'支持开放式办公,但它在将.xlsx文件转换为PDF文件方面做得很好。它需要一些设置。 Link to Jacob
在调查我在Excel中发现的问题时 - >页面设置,如果您将Fit更改为1页宽和1页高,它会挤压每个工作表以适合PDF中的每个页面。我遇到的另一个问题是wrap text属性,使用它时要小心,因为它可能导致布局问题。
我做了一个小的实现,在Excel 2010和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");
}
}
以下是根据上述代码生成的PDF文件。注意第3页,内容有点斩断,当你删除wrap文本属性和合并单元格时,它生成正常。 Converted XLSX
答案 3 :(得分:0)
这是为所有工作表设置相同页面参数的Excel VBA代码。抱歉,我不熟悉Openoffice编程,假设API类似:
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