Отсутствие листов и проблема с размером страницы, когда excel (.xlsx) конвертирует в pdf (.pdf), используя открытый офис

Я создал приложение, использующее JodConverter и Open-Office для преобразования excel (.xlsx) в PDF, приложение отлично работает, но я столкнулся с двумя проблемами

  • Страницы выходного PDF файла в формате A4, так как из-за этого некоторые данные рабочего листа были отрезаны. так как я хочу, чтобы каждый рабочий лист Excel был таким же полным, как на одной странице, какой бы размер ни был.

  • Отсутствие рабочих листов отсутствовало, скажем, если у моего excel есть 8 листов, я получаю только два или три в выходе PDF

Даже если мы попытались преобразовать в PDF непосредственно из open-office, это дало бы вышеупомянутые аналогичные проблемы

Файл 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();
    }

Ответ 1

Я использовал (бесплатный) драйвер принтера PrimoPDF для создания PDF непосредственно из Excel. Большое количество страниц (20+) связано с тем, что в одном из рабочих листов отсутствует опция печати "подходящая страница", а третья - если я хорошо помню. После исправления команды для печати всех листов все еще приводит к созданию двух файлов PDF. PrimoPDF дважды запрашивает имя файла, тогда как он должен запрашивать только одно. Я предполагаю, что ваша программа просто создает PDF файл, соответствующий первой части, так как обычно создается только один PDF файл. У меня нет объяснений для двухстраничной печати. Возможно, это связано с некоторыми настройками печати на одном из листов, которые заставляют печать выполнять "две партии". Например, другое значение разрешения может препятствовать печати в одной партии. Вывод: обходной путь заключается в печати с помощью PrimoPDF и объединении двух файлов PDF с использованием одной из свободно доступных программ в Интернете. Для долговременного решения вам нужно будет подробно проверить настройки печати всех листов и убедиться, что они равны.

Ответ 2

Я боюсь, что мой предыдущий ответ был недостаточно ясен. Итак, вот в чем суть:

  • Все ваши рабочие листы кроме 3-го имеют разрешение 600. На 3-м листе разрешение остается пустым
  • Измените разрешение 3-го листа на 600
  • Файл PDF теперь будет генерироваться нормально, содержащий все листы.

По-видимому, Excel может создавать только PDF файлы, где разрешения страниц всех листов одинаковы. Если он сталкивается с листом с разным (пустым) разрешением, он просто прекращает выдавать выходные данные без предупреждения. ИМХО это ошибка в Excel. К счастью, обходной путь прост.

Надеюсь, это пояснит мой предыдущий ответ.

Ответ 3

Вы можете использовать Microsoft Excel для любых преобразований .xlsx в PDF, в настоящее время я разрабатываю приложение, которое использует Jacob (Java Com Bridge) тонкую оболочку для подключения к объектным моделям программ Microsoft Office, afaik it doesn ' t поддерживает open-office, но он неплохо выполняет преобразование вашего файла .xlsx в файл PDF. Это требует некоторой настройки. Ссылка на Jacob

При изучении проблемы, которую я нашел в Excel → Page Setup, если вы измените Fit на 1 страницу в ширину и 1 страницу в высоту, она сжимает каждый рабочий лист, чтобы он поместился на каждой странице в формате PDF. Еще одна проблема, с которой я столкнулся, - это свойство текста обтекания, будьте осторожны, когда вы его используете, так как это может вызвать проблемы с компоновкой.

Я сделал небольшую реализацию, протестированную в 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 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, созданный с помощью приведенного выше кода. Обратите внимание на третью страницу, содержимое немного отрублено, когда вы удаляете свойство текста обтекания и объединенных ячеек, оно генерирует штраф. Конвертированный XLSX

Ответ 4

Это код 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