mirror of https://github.com/apache/poi.git
added Ant target to compile scratchpad examples, added example HSMF application that converts a .msg file to text and extracts attachments, see Bugzilla 47922
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@821500 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5d3d269faf
commit
31236d1bd5
23
build.xml
23
build.xml
|
@ -27,6 +27,7 @@ under the License.
|
|||
Modified by:
|
||||
|
||||
Rainer Klute klute@rainer-klute.de
|
||||
Bruno Girin brunogirin@gmail.com
|
||||
|
||||
This build was tested with ant 1.6.2 although it will probably work with
|
||||
other versions. The following jar files should be available on the
|
||||
|
@ -110,6 +111,10 @@ under the License.
|
|||
<property name="examples.src" location="src/examples/src"/>
|
||||
<property name="examples.output.dir" location="build/examples-classes"/>
|
||||
|
||||
<!-- Scratchpad Examples: -->
|
||||
<property name="scratchpad.examples.src" location="src/scratchpad/examples/src"/>
|
||||
<property name="scratchpad.examples.output.dir" location="build/scratchpad-examples-classes"/>
|
||||
|
||||
<!-- OOXML support: -->
|
||||
<property name="ooxml.src" location="src/ooxml/java"/>
|
||||
<property name="ooxml.src.test" location="src/ooxml/testcases"/>
|
||||
|
@ -273,6 +278,7 @@ under the License.
|
|||
<mkdir dir="${scratchpad.output.dir}"/>
|
||||
<mkdir dir="${contrib.output.dir}"/>
|
||||
<mkdir dir="${examples.output.dir}"/>
|
||||
<mkdir dir="${scratchpad.examples.output.dir}"/>
|
||||
<mkdir dir="${ooxml.output.dir}"/>
|
||||
<mkdir dir="${main.output.test.dir}"/>
|
||||
<mkdir dir="${contrib.output.test.dir}"/>
|
||||
|
@ -423,8 +429,8 @@ under the License.
|
|||
</target>
|
||||
|
||||
<target name="compile" depends="init, compile-main,
|
||||
compile-scratchpad, compile-contrib, compile-examples"
|
||||
description="Compiles the POI main classes, scratchpad, contrib, and examples"/>
|
||||
compile-scratchpad, compile-contrib, compile-examples, compile-scratchpad-examples"
|
||||
description="Compiles the POI main classes, scratchpad, contrib, examples, and scratchpad examples"/>
|
||||
|
||||
<target name="compile-main">
|
||||
<copy todir="${main.output.dir}">
|
||||
|
@ -508,6 +514,19 @@ under the License.
|
|||
</javac>
|
||||
</target>
|
||||
|
||||
<target name="compile-scratchpad-examples" depends="init,compile-ooxml">
|
||||
<javac target="${jdk.version.class}" source="${jdk.version.source}"
|
||||
failonerror="true" destdir="${scratchpad.examples.output.dir}" debug="on" fork="yes"
|
||||
srcdir="${scratchpad.examples.src}">
|
||||
<classpath>
|
||||
<path refid="examples.classpath"/>
|
||||
<path refid="ooxml.classpath"/>
|
||||
<pathelement path="${ooxml.output.dir}"/>
|
||||
<pathelement location="${junit.jar1.dir}"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<target name="compile-ooxml" depends="init, compile-main, compile-scratchpad">
|
||||
<javac target="1.5" source="1.5"
|
||||
destdir="${ooxml.output.dir}" debug="on" srcdir="${ooxml.src}">
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
|
||||
<changes>
|
||||
<release version="3.6-beta1" date="2009-??-??">
|
||||
<action dev="POI-DEVELOPERS" type="add">47922 - added example HSMF application that converts a .msg file to text and extracts attachments</action>
|
||||
<action dev="POI-DEVELOPERS" type="add">47903 - added Ant target to compile scratchpad examples</action>
|
||||
<action dev="POI-DEVELOPERS" type="add">47839 - improved API for OOXML custom properties</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">47862 - fixed XSSFSheet.setColumnWidth to handle columns included in a column span</action>
|
||||
<action dev="POI-DEVELOPERS" type="fix">47804 - fixed XSSFSheet.setColumnHidden to handle columns included in a column span</action>
|
||||
|
|
|
@ -0,0 +1,185 @@
|
|||
/* ====================================================================
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
package org.apache.poi.hsmf.examples;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.poi.hsmf.MAPIMessage;
|
||||
import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
|
||||
|
||||
/**
|
||||
* Reads one or several Outlook MSG files and for each of them creates
|
||||
* a text file from available chunks and a directory that contains
|
||||
* attachments.
|
||||
*
|
||||
* @author Bruno Girin
|
||||
*
|
||||
*/
|
||||
public class Msg2txt {
|
||||
|
||||
/**
|
||||
* The stem used to create file names for the text file and the directory
|
||||
* that contains the attachments.
|
||||
*/
|
||||
private String fileNameStem;
|
||||
|
||||
/**
|
||||
* The Outlook MSG file being processed.
|
||||
*/
|
||||
private MAPIMessage msg;
|
||||
|
||||
public Msg2txt(String fileName) throws IOException {
|
||||
fileNameStem = fileName;
|
||||
if(fileNameStem.endsWith(".msg") || fileNameStem.endsWith(".MSG")) {
|
||||
fileNameStem = fileNameStem.substring(0, fileNameStem.length() - 4);
|
||||
}
|
||||
msg = new MAPIMessage(fileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes the message.
|
||||
*
|
||||
* @throws IOException if an exception occurs while writing the message out
|
||||
*/
|
||||
public void processMessage() throws IOException {
|
||||
String txtFileName = fileNameStem + ".txt";
|
||||
String attDirName = fileNameStem + "-att";
|
||||
PrintWriter txtOut = null;
|
||||
try {
|
||||
txtOut = new PrintWriter(txtFileName);
|
||||
try {
|
||||
String displayFrom = msg.getDisplayFrom();
|
||||
txtOut.println("From: "+displayFrom);
|
||||
} catch (ChunkNotFoundException e) {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
String displayTo = msg.getDisplayTo();
|
||||
txtOut.println("To: "+displayTo);
|
||||
} catch (ChunkNotFoundException e) {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
String displayCC = msg.getDisplayCC();
|
||||
txtOut.println("CC: "+displayCC);
|
||||
} catch (ChunkNotFoundException e) {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
String displayBCC = msg.getDisplayBCC();
|
||||
txtOut.println("BCC: "+displayBCC);
|
||||
} catch (ChunkNotFoundException e) {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
String subject = msg.getSubject();
|
||||
txtOut.println("Subject: "+subject);
|
||||
} catch (ChunkNotFoundException e) {
|
||||
// ignore
|
||||
}
|
||||
try {
|
||||
String body = msg.getTextBody();
|
||||
txtOut.println(body);
|
||||
} catch (ChunkNotFoundException e) {
|
||||
System.err.println("No message body");
|
||||
}
|
||||
Map attachmentMap = msg.getAttachmentFiles();
|
||||
if(attachmentMap.size() > 0) {
|
||||
File d = new File(attDirName);
|
||||
if(d.mkdir()) {
|
||||
for(
|
||||
Iterator ii = attachmentMap.entrySet().iterator();
|
||||
ii.hasNext();
|
||||
) {
|
||||
Map.Entry entry = (Map.Entry)ii.next();
|
||||
processAttachment(d, entry.getKey().toString(),
|
||||
(ByteArrayInputStream)entry.getValue());
|
||||
}
|
||||
} else {
|
||||
System.err.println("Can't create directory "+attDirName);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if(txtOut != null) {
|
||||
txtOut.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes a single attachment: reads it from the Outlook MSG file and
|
||||
* writes it to disk as an individual file.
|
||||
*
|
||||
* @param dir the directory in which to write the attachment file
|
||||
* @param fileName the name of the attachment file
|
||||
* @param fileIn the input stream that contains the attachment's data
|
||||
* @throws IOException when any of the file operations fails
|
||||
*/
|
||||
public void processAttachment(File dir, String fileName,
|
||||
ByteArrayInputStream fileIn) throws IOException {
|
||||
File f = new File(dir, fileName);
|
||||
OutputStream fileOut = null;
|
||||
try {
|
||||
fileOut = new FileOutputStream(f);
|
||||
byte[] buffer = new byte[2048];
|
||||
int bNum = fileIn.read(buffer);
|
||||
while(bNum > 0) {
|
||||
fileOut.write(buffer);
|
||||
bNum = fileIn.read(buffer);
|
||||
}
|
||||
} finally {
|
||||
try {
|
||||
if(fileIn != null) {
|
||||
fileIn.close();
|
||||
}
|
||||
} finally {
|
||||
if(fileOut != null) {
|
||||
fileOut.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes the list of arguments as a list of names of Outlook MSG files.
|
||||
*
|
||||
* @param args the list of MSG files to process
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
if(args.length <= 0) {
|
||||
System.err.println("No files names provided");
|
||||
} else {
|
||||
for(int i = 0; i < args.length; i++) {
|
||||
try {
|
||||
Msg2txt processor = new Msg2txt(args[i]);
|
||||
processor.processMessage();
|
||||
} catch (IOException e) {
|
||||
System.err.println("Could not process "+args[i]+": "+e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue