Il manque des feuilles de travail et la taille de la page.XLSX) convertir en pdf (.pdf) utilisation des bureaux ouverts

j'ai créé une application en utilisant JodConverter et Open-Office pour convertir un excel (.xlsx)PDF, L'application fonctionne bien, mais je suis confronté à deux problèmes

  1. les pages de PDF de sortie est sous la forme de format A4, car en raison de cette certaine feuille de travail le contenu a été découpé. puisque je veux chaque feuille de travail de l'excel aussi complet que dans une page quelle que soit la taille.

  2. le nombre de feuilles de travail manquantes, disons si mon excel a 8 feuille de travail je ne reçois que deux ou trois dans le PDF sortie

Même si nous avons essayé de convertir pdf directement à partir de open-office, its donnant les questions similaires ci-dessus

Fichier Excel - ss1.xlsx

Output PDF -travail.pdf

quelqu'un peut-il me dire une solution à ce

Mon code est donné ci-dessous

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();
    }
10
demandé sur Alex Man 2014-06-17 22:06:54

4 réponses

j'ai utilisé le pilote D'imprimante (gratuit) PrimoPDF pour créer le PDF directement depuis Excel. Le grand nombre de pages (20+) est dû au fait que l'option d'impression "fit to page" est absente dans l'une des feuilles de travail, la troisième si je me souviens bien. Après correction, la commande d'imprimer toutes les feuilles de travail donne encore 2 fichiers PDF à générer. PrimoPDF demande deux fois un nom de fichier alors qu'il n'en demande qu'un seul. Je suppose que votre programme génère juste le PDF correspondant à la première partie puisque normalement un seul PDF doit être généré. Je n'ai pas d'explication pour l'impression en 2 parties. Il pourrait être dû à des paramètres d'impression dans une des feuilles de calcul que les forces de l'impression en deux lots'. Par exemple, une valeur de résolution différente peut empêcher l'impression dans un lot. Conclusion: la solution est d'imprimer avec PrimoPDF et de concaténer les 2 fichiers PDF en utilisant l'un des programmes librement disponibles sur le web. Pour une solution durable, vous devrez vérifier l'impression paramètres de toutes les feuilles de travail en détail et assurez-vous qu'ils sont égaux.

2
répondu Paul1n 2014-07-28 12:22:21

je crains que ma réponse n'était pas assez clair. Voici donc l'essence:

  • toutes vos feuilles de travail excepté le 3ème avoir une résolution de 600. Dans la 3ème feuille la résolution est vide
  • Changer la résolution de la 3ème feuille à 600
  • le fichier PDF sera maintenant généré normalement, contenant toutes les feuilles.

apparemment Excel ne peut produire que des PDF où les résolutions de page de toutes les feuilles de calcul sont les mêmes. S'il rencontre une feuille avec une résolution différente (de blanc) il arrête juste de produire la sortie sans donner aucun avertissement. IMHO ceci est un bug dans Excel. Heureusement, la solution est facile.

J'espère que cela clarifie ma réponse précédente.

2
répondu Paul1n 2014-08-23 10:18:16

Vous pouvez utiliser Microsoft Excel pour faire n'importe quoi .XLSX conversions en PDF, je suis en train de développer une application qui utilise Jacob, (Java Com Bridge) un wrapper mince pour se connecter aux modèles D'objet des programmes de Microsoft Office, afaik il ne supporte pas open-office, mais il fait un bon travail à la conversion de votre .xlsx fichier PDF. Il nécessite un peu de configuration. Lien vers Jacob

en regardant le problème que j'ai trouvé dans Excel - > configuration de la Page, si vous changez Fit à 1 page de large et 1 page de haut, il serre chaque feuille de travail pour s'adapter sur chaque page en PDF. Un autre problème que j'ai rencontré était l'écharpe propriété de texte, être prudent lorsque vous l'utilisez, car il peut causer des problèmes d'implantation.

j'ai fait une petite implémentation de ceci, testé sur Excel 2010 et 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");
    }

}

voici le fichier PDF généré à partir du code ci-dessus. Notez la 3ème page, le contenu est un peu coupé, lorsque vous supprimez la propriété wrap text et fusionné des cellules, il génère de l'amende. Converted XLSX

1
répondu PalinDrome555 2014-08-05 13:18:32

Il S'agit du Code Excel VBA pour configurer les mêmes paramètres de page pour toutes les feuilles de travail. Désolé, Je ne suis pas familier avec la programmation Openoffice, supposons que L'API est similaire:

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
0
répondu Paul1n 2014-08-27 11:03:17