30

I have to print the whole sourcecode of a java-project. The final version should look like: Eclipse: File -> Print. But with this function you can only print one file at once.

Is there a way to print (or create a pdf/rtf of) the whole project (all *.java, *.xml, ... files) with one command?

Im using eclipse galileo on windows xp sp3


EDIT: For each class/file the page should (more or less) look like this:

C:\..\..\..\LibraryExtractor.java

1 package utils.libraries;
2
3 import java.io.File;
9
10 /**
11 * @
12 * @
13 * @
14 */
15 public class LibraryExtractor {
16
17 /**
18 * 
19 * 
20 *
21 * 
22 * 
23 *
24 *
25 */
26 public static void extranctLibrary(String library, File targetFile) throws
IOException, URISyntaxException {
27 targetFile.getParentFile().mkdirs();
28 if (!targetFile.exists())
29 targetFile.createNewFile();
30
31 ClassLoader classLoader = LibraryExtractor.class.getClassLoader();
32 InputStream in = classLoader.getResourceAsStream(library);
33 OutputStream out = new FileOutputStream(targetFile);
34
35 byte[] buf = new byte[1024];
36 int len;
37
38 while ((len = in.read(buf)) > 0)
39 out.write(buf, 0, len);
40
41 in.close();
42 out.close();
43 }
44 }
45

SOLUTION:

  1. enscript (with Cygwin)

  2. Java2Html Eclipse-Plugin (only works with Europa)

Community
  • 1
  • 1
oliver31
  • 2,523
  • 3
  • 19
  • 25
  • Number of files? Number of projects? – Thorbjørn Ravn Andersen Dec 17 '09 at 11:42
  • 50 - 100 files for one project – oliver31 Dec 17 '09 at 11:45
  • Where was the Technology? Paper was replaced by Softcopies... and lots of version control systems are available. Why do want to print all files? – Gopi Dec 17 '09 at 12:25
  • 1
    because it is required... it surely wasn't my idea -.- – oliver31 Dec 17 '09 at 12:30
  • 6
    I see you added a bounty. But you asked this question 17 december, which means in the meanwhile you've had a plenty of time to print the files one by one. Just open them all and press ctrl+p on each of them. "Only" 50-100 times. Maybe one hour of work, but certainly not 3 weeks of work. Was you really that lazy? – BalusC Jan 06 '10 at 14:20
  • 2
    @BalusC: I have to do a ten-day project in march. At the end i have to print the whole documentation (projectmanagement, uml-diagramms, other stuff) + the whole source code at least twice. i don't really want/have time to print every file one by one. – oliver31 Jan 06 '10 at 14:45
  • 3
    Rather use a batch/shell script or write something in Java yourself with help of javax.print API. – BalusC Jan 06 '10 at 14:53
  • 2
    Have none of you ever needed that for school? Don't know if this is @r3zn1k's case, but I remember one of my teachers (who was severely skill-challenged) to flip through the entire code print-out and ask me to explain what all the automatically generated SOAP code was about... This was after he inquired one of my co-students about the type of printer it was printed with.. – Boris Callens Jan 10 '10 at 22:55
  • Also minor heads-up: do you realize your function is called "extranctLibrary"? – Boris Callens Jan 10 '10 at 22:56

8 Answers8

63

If you don't mind installing Cygwin, or running on Linux, the following command will do what you want:

enscript -r -2 --file-align=2 --highlight --line-numbers -o - `find . -name '*.java'` | ps2pdf - files.pdf

enscript is a program for converting text files to a variety of output formats; PostScript is the default, but you can also produce HTML, RTF, and a few others. The -r option says to print in landscape, -2 is two columns per page (save trees), --file-align=2 says that each new file should start on its own physical page, --highlight turns on language-specific syntax highlighting (it will try to figure out the language, or you can specify "java"), --line-numbers should be obvious, and -o - sends the output to standard-out (where it's piped to ps2pdf).

find generates the list of files; here I'm telling it to find all Java files under in the current directory. The output is passed as arguments to enscript; for "50-100 files" you should be OK, but you might need to read about xargs. You could get rid of the -name argument to generate a list of all files, or add multiple -name arguments to add more file types to the list; I wouldn't go with the "all files" approach, because then you'll get source-control files.

ps2pdf takes the PostScript output from enscript and converts it to PDF, which you can print.

kdgregory
  • 38,754
  • 10
  • 77
  • 102
  • Didn't read your whole command til after I commented -- note that if you drop the `-o -`, enscript will spool directly to the printer (or you can specify the printer with `-P `) and you can skip the pipe to `ps2pdf`. – Lytol Jan 08 '10 at 00:04
  • Side note: instead of Cygwin, one can use relevant commands from GnuWin32 (http://gnuwin32.sourceforge.net/). In particular Enscript for Windows (http://gnuwin32.sourceforge.net/packages/enscript.htm) and FindUtils for Windows (http://gnuwin32.sourceforge.net/packages/findutils.htm) - see the execdir option of find to run a command for each file. – MaD70 Jan 13 '10 at 05:07
  • That seems like a great tip but I can't find ps2pdf in Cygwin packages? How to install this utility for Cygwin? – Piotr Sobczyk Jul 20 '12 at 07:45
7

If you can afford spending $50 buy Ultraedit, open all files and print it...

Ultraedit features about printing includes:

  • Print preview
  • Print line numbers
  • Print command doesn't print hidden lines
  • Headers/footers (with alignment commands), margins and page breaks
  • Printing of syntax highlighting in color
  • Print 2 pages on one sheet in landscape or portrait modes
  • Separate font selection for display and printer (supports all fonts installed including True Type fonts)
  • Print all open files
JuanZe
  • 8,007
  • 44
  • 58
  • 1
    Just checked, it has a free trial version, so this will probably solve your problem for now. – Edan Maor Jan 06 '10 at 15:13
  • I remember using that a while ago. It was quite nice since I could connect to a FTP and read/write files from there. – David Brunelle Jan 06 '10 at 20:48
  • @David I use PSPad and also the feature I enjoy the most is the same: connecting via FTP and edit files directly on the server. – JuanZe Jan 06 '10 at 21:29
  • 1
    Thanks for your answer. "Print all open files" is useful for few files. For a whole project it's not the best solution... – oliver31 Jan 13 '10 at 12:04
6

I've used Java2Html from Eclipse in the past. See whether it suits your needs.

Gregory Pakosz
  • 69,011
  • 20
  • 139
  • 164
  • 1
    Thank you for your answer. My "problem" can be solved with the Java2Html Eclipse-Plugin. Okay it doesn't work with Galileo (it does with Europa) and the conversion to RTF with multiple files doesn't work, but you can still convert everything to HTML (edit the HTML) and than copy the HTML-Output to an RTF file. If you don't want to install Cygwin this is the best solution. – oliver31 Jan 13 '10 at 12:11
3

I don't think you can do this within Eclipse (of course you could write a plugin which does this).

If you use Ant as your build tool you could use the concat task and then print the resulting file

<concat destfile="${concat.src.dir}/concat.txt" force="no">
    <filelist dir="${src.dir}" includes="**/*.java **/*.xml" />
</concat>
jitter
  • 53,475
  • 11
  • 111
  • 124
  • You didn't say anything about that did you in your question – jitter Dec 17 '09 at 13:53
  • Yep, r3zn1k, it serves you well to actually spell out your requirements in your question. :) – delfuego Dec 17 '09 at 14:21
  • The final version should look like "Eclipse: File -> Print" == linenumbers and syntax-highlighting – oliver31 Dec 18 '09 at 07:37
  • Actually, eclipse only prints line numbers if the line number checkbox is checked in the text editor properties. So if I don't have line numbers switched on, then I don't get line numbers. – Matthew Farwell Jan 06 '10 at 17:21
1

An option that looks fancy is to use vim in batch mode to generate a bunch of colorized HTML files and then print by dragging all of them to the printer (I know that can be done, some time ago a colleague printed the whole J2SE API, and I hope she didn't it page by page xD).

find -name "*.java" -exec vim '+set nu' +TOhtml +wq +q '{}' \;
fortran
  • 74,053
  • 25
  • 135
  • 175
1

If you want the formatting exactly as it is in Eclipse, then you will probably have to print from Eclipse. You'll spend more time trying to duplicate the print formatting that you have in Eclipse with another method.

Another important point: If you are using folding in the text editors in Eclipse, then the folded lines will not be displayed in the printed version.

If you really really have to furnish the source code as trees, then I would suggest that you try and persuade your clients that colour and syntax highlighting are not important, and then format everything in Eclipse, and print from elsewhere. There are suggestions for the line numbers etc in other answers.

Matthew Farwell
  • 60,889
  • 18
  • 128
  • 171
1

http://sourceforge.net/projects/javasrc2pdf/?source=typ_redirect

This creates all the PDFs and with reasonably good syntax highlighting however they are all in separate files. But there are plenty of ways to combine pdfs out there

Stuart Clark
  • 611
  • 8
  • 13
0

I would use pygments with linenos enabled as explained in http://pygments.org/docs/formatters/

Xavier Combelle
  • 10,968
  • 5
  • 28
  • 52