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
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.
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();
}
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.
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.
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
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