[C++/Java] .doc zu .pdf umwandeln

Tron36

Ensign
Registriert
Jan. 2011
Beiträge
212
Hallo alle zusammen,
gibt es eine möglichkeit in Java oder C/C++ ein .doc Dokument in ein .pdf Dokument um zu wandeln?

Grüße
Dogan
 
Guck dir die libs docx4j und iText an.
APIs sind recht gut beschrieben und passende Tutorials oder Beispiele solltest du über Google auch finden können.
 
Natürlich. Du musst es nur implementiere ;-)

Ansonsten schau dich mal um ob es Libraries gibt, die du da nutzen kannst.

Ich würde mal in den Code von Libreoffice schauen. Da gibt es die funktion per Kommandozeile. Zweite befehl von unten:
--convert-to output_file_extension[:output_filter_name] [--outdir output_dir] files
 
Hi,
alles hilfreiche antworten. Ich wollte halt kein Programm nehmen, sondern versuchen selbst umzuwandeln.

Grüße
Dogan
 
Wenn du nicht mal Libraries nutzen willst, dann setzt dich mit den doc und pdf Formaten auseinander. Die doc liest du dann ein, parst diese und baust deine pdf selber zusammen. Bei Microsoft Zeug, wirst du aber schwierigkeiten haben, da was vernünftiges zu finden.
 
Das ganze geht mit XML/XSLT/XSL-FO. Leider ist die Einarbeitung in das Containerformat von MS umfangreich. Als erstes würde ich das XML Normalisieren und dann mit XSL-FO die PDF erstellen. Als XSL Prozessor empfehle ich Saxon HE(in Java geschrieben).
 
Zuletzt bearbeitet:
Du hast dir aber 2 sehr "einfache" Formate ausgewählt... </ironie>

Wenn du das wirklich "per Hand" machen willst, wird dir der Weg von palace4d nicht erspart bleiben. :/
 
Viel Spaß mit dem MS parsing - das war mal die Hölle und ist es bestimmt heute noch ;) Long Term Project here ya go!
 
Da muss ich meinen Vorpostern zustimmen. Für solche Projekte haben schon ganze Entwicklungsteams Monate oder gar Jahre gebraucht. Das .doc Format ist nicht offen, d.h. es gibt von MS keine vollständige Spezifikation dafür. Wenn es dir also einfach nur darum geht die Umwandlung zu machen sind Bibliotheken oder der Aufruf externer Programme deutlich sinnvoller. Wenn du hingegen so etwas einfach mal selbst machen willst, würde ich zumindest ein Format wählen, von dem du die Spezifikationen bekommen kannst. Da kämen z.B. die Open/Libre Office Formate in Frage. Die sind offen und sehr (!!!) viel kürzer und übersichtlicher.

Falls du dich trotz allem enschließt einen Konverter komplett selbst zu basteln, kannst du ihn ja mal den Open/Libre Office Leuten zur Verfügung stellen, die arbeiten schon seit Jahren daran und obwohl er mittlerweile ganz gut funktioniert, gibt es immer noch Sachen die nicht richtig übertragen werden.
 
Bezüglich der Sache, dass .doc nicht dokumentiert ist, dass stimmt nicht ganz:

http://msdn.microsoft.com/en-us/library/cc313153(v=office.12).aspx

Dort gibt es ein 622 (!!) Seiten Dokument, was den Aufbau und Inhalt erklärt. Innerhalb von diesem Dokument wird auch noch auf andere verwiesen. Bis auf ein paar Sachen steht dort eigentlich alles drin. Ich würde also nicht sagen, dass es nicht dokumentiert ist. Aus eigener Erfahrung kann ich jedoch sagen, dass es schon sehr lange dauert, diese Dokumentation durchzuarbeiten.

Übrigens, auf der Open Specification Seite von Microsoft ist so ziemlich jedes Format und Protocol dokumentiert. Sicher, die Dokumentation ist keine leichte Lektüre, aber man kann sie auf jedenfall verwenden.
 
Limit schrieb:
Da muss ich meinen Vorpostern zustimmen. Für solche Projekte haben schon ganze Entwicklungsteams Monate oder gar Jahre gebraucht. Das .doc Format ist nicht offen, d.h. es gibt von MS keine vollständige Spezifikation dafür.

Naja, das stimmt ja nicht. Aber dennoch hab ich es als höllisch empfunden und es hat eine Menge Arbeit gemacht. Vergessen gings dann sogar schnell ...
 
Hi,
ich glaube mit libaries würde es einfacher gehen.

grüße
Tron36
 
ja, wenn sich mit den ganzen dokumentationen zu beschäftigen bissl länger dauern würde, dann ja
 
Sollte eigentlich stimmen. Kannst du auch selber mit dem Taschenrechner oder google testen.
 
Tron36 schrieb:
gibt es eine möglichkeit in Java oder C/C++ ein .doc Dokument in ein .pdf Dokument um zu wandeln?
So geht's:

- OpenOffice oder LibreOffice installieren (falls noch nicht geschehen)
- Die Dateien "ridl.jar", "juh.jar" und "unoil.jar" (diese sollten sich im Verzeichnis "URE/java/" bzw. "Basis/program/classes/" unter dem Programminstallationspfad befinden) in den CLASSPATH mit aufnehmen
- Zusätzlich noch den Pfad "program" unter dem Programminstallationspfad mit in den CLASSPATH mit aufnehmen

Der CLASSPATH sollte in etwa so aussehen:
Code:
CLASSPATH="C:/Programme/OpenOffice.org 3/URE/java/ridl.jar;C:/Programme/OpenOffice.org 3/URE/java/juh.jar;C:/Programme/OpenOffice.org 3/Basis/program/classes/unoil.jar;C:/Programme/OpenOffice.org3/program"

Dann das folgende Java-Programm
Code:
import java.io.File;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.beans.PropertyValue;
import com.sun.star.frame.XStorable;
import com.sun.star.util.XCloseable;


public class Doc2Pdf
{
	public static void main(String args[])
	{
		if ( args.length != 2 )
		{
			System.out.println("usage: java Doc2Pdf <doc-file> <pdf-file>");
			System.exit(1);
		}
		
		com.sun.star.uno.XComponentContext xContext = null;
		
		try
		{
			// get the remote office component context
			xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
			
			// get the remote office service manager
			com.sun.star.lang.XMultiComponentFactory xMCF= xContext.getServiceManager();
			
			Object oDesktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
			
			XComponentLoader xCompLoader= (XComponentLoader)UnoRuntime.queryInterface(XComponentLoader.class, oDesktop);
			
			File infile= new File(args[0]);
			if (!infile.canRead())
			{
				System.out.println("Can't read File " + args[0]);
				System.exit(1);
			}
            
            
			// Loading the wanted document
			PropertyValue propertyValues[] =new com.sun.star.beans.PropertyValue[1];
			propertyValues[0] = new com.sun.star.beans.PropertyValue();
			propertyValues[0].Name = "Hidden";
			propertyValues[0].Value = new Boolean(true);

			String inUrl= "file:///" + infile.getAbsolutePath().replace( '\\', '/' );
			Object document =xCompLoader.loadComponentFromURL(inUrl, "_blank", 0, propertyValues);

			
			// Getting an object that will offer a simple way to store
			// a document to a URL.
			XStorable xStorable = (XStorable)UnoRuntime.queryInterface(com.sun.star.frame.XStorable.class, document );
			
			
			// export document to pdf
			PropertyValue storeProps[] = new PropertyValue[1];
			storeProps[0] = new PropertyValue();
			storeProps[0].Name = "FilterName";
			storeProps[0].Value = "writer_pdf_Export";
			
			File outfile= new File(args[1]);
			String outUrl= "file:///" + outfile.getAbsolutePath().replace( '\\', '/' );
			xStorable.storeToURL(outUrl, storeProps);

			
			// close document
			XCloseable xcloseable = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, document);
			xcloseable.close(false);
		}
		catch( Exception e )
		{
			e.printStackTrace(System.err);
			System.exit(1);
		}

		System.exit(0);
	}
}
compilieren und dann kannst Du mit
Code:
java Doc2Pdf <doc-file> <pdf-file>
Deine Doc-Datei nach PDF wandeln.


HTH

BigNum
 
Zurück
Oben