Start on a HPBF dumper
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@686290 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
644e4e6cb7
commit
dacade8b45
130
src/scratchpad/src/org/apache/poi/hpbf/dev/HPBFDumper.java
Normal file
130
src/scratchpad/src/org/apache/poi/hpbf/dev/HPBFDumper.java
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
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.hpbf.dev;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.ddf.DefaultEscherRecordFactory;
|
||||||
|
import org.apache.poi.ddf.EscherRecord;
|
||||||
|
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||||
|
import org.apache.poi.poifs.filesystem.DocumentEntry;
|
||||||
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For dumping out the contents of HPBF (Publisher)
|
||||||
|
* files, while we try to figure out how they're
|
||||||
|
* constructed.
|
||||||
|
*/
|
||||||
|
public class HPBFDumper {
|
||||||
|
private POIFSFileSystem fs;
|
||||||
|
public HPBFDumper(POIFSFileSystem fs) {
|
||||||
|
this.fs = fs;
|
||||||
|
}
|
||||||
|
public HPBFDumper(InputStream inp) throws IOException {
|
||||||
|
this(new POIFSFileSystem(inp));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] getData(DirectoryNode dir, String name) throws IOException {
|
||||||
|
DocumentEntry docProps =
|
||||||
|
(DocumentEntry)dir.getEntry(name);
|
||||||
|
|
||||||
|
// Grab the document stream
|
||||||
|
byte[] d = new byte[docProps.getSize()];
|
||||||
|
dir.createDocumentInputStream(name).read(d);
|
||||||
|
|
||||||
|
// All done
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
if(args.length < 1) {
|
||||||
|
System.err.println("Use:");
|
||||||
|
System.err.println(" HPBFDumper <filename>");
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
HPBFDumper dump = new HPBFDumper(
|
||||||
|
new FileInputStream(args[0])
|
||||||
|
);
|
||||||
|
|
||||||
|
System.out.println("Dumping " + args[0]);
|
||||||
|
dump.dumpContents();
|
||||||
|
dump.dumpEnvelope();
|
||||||
|
dump.dumpEscher();
|
||||||
|
|
||||||
|
// Still to go:
|
||||||
|
// (0x03)Internal
|
||||||
|
// (0x01)CompObj
|
||||||
|
// Objects
|
||||||
|
// Quill
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump out the escher parts of the file.
|
||||||
|
* Escher -> EscherStm and EscherDelayStm
|
||||||
|
*/
|
||||||
|
public void dumpEscher() throws IOException {
|
||||||
|
DirectoryNode escherDir = (DirectoryNode)
|
||||||
|
fs.getRoot().getEntry("Escher");
|
||||||
|
|
||||||
|
dumpEscherStm(escherDir);
|
||||||
|
dumpEscherDelayStm(escherDir);
|
||||||
|
}
|
||||||
|
private void dumpEscherStream(byte[] data) {
|
||||||
|
DefaultEscherRecordFactory erf =
|
||||||
|
new DefaultEscherRecordFactory();
|
||||||
|
|
||||||
|
// Dump
|
||||||
|
int left = data.length;
|
||||||
|
while(left > 0) {
|
||||||
|
EscherRecord er = erf.createRecord(data, 0);
|
||||||
|
er.fillFields(data, 0, erf);
|
||||||
|
left -= er.getRecordSize();
|
||||||
|
|
||||||
|
System.out.println(er.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected void dumpEscherStm(DirectoryNode escherDir) throws IOException {
|
||||||
|
byte[] data = getData(escherDir, "EscherStm");
|
||||||
|
System.out.println("");
|
||||||
|
System.out.println("EscherStm - " + data.length + " bytes long:");
|
||||||
|
if(data.length > 0)
|
||||||
|
dumpEscherStream(data);
|
||||||
|
}
|
||||||
|
protected void dumpEscherDelayStm(DirectoryNode escherDir) throws IOException {
|
||||||
|
byte[] data = getData(escherDir, "EscherDelayStm");
|
||||||
|
System.out.println("");
|
||||||
|
System.out.println("EscherDelayStm - " + data.length + " bytes long:");
|
||||||
|
if(data.length > 0)
|
||||||
|
dumpEscherStream(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dumpEnvelope() throws IOException {
|
||||||
|
byte[] data = getData(fs.getRoot(), "Envelope");
|
||||||
|
|
||||||
|
System.out.println("");
|
||||||
|
System.out.println("Envelope - " + data.length + " bytes long:");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dumpContents() throws IOException {
|
||||||
|
byte[] data = getData(fs.getRoot(), "Contents");
|
||||||
|
|
||||||
|
System.out.println("");
|
||||||
|
System.out.println("Contents - " + data.length + " bytes long:");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user