Avoid creating temporary files when opening OPC packages from input stream
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@898927 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b88672b637
commit
8b377f2f67
@ -34,6 +34,7 @@
|
||||
|
||||
<changes>
|
||||
<release version="3.7-SNAPSHOT" date="2010-??-??">
|
||||
<action dev="POI-DEVELOPERS" type="add">Avoid creating temporary files when opening OPC packages from input stream</action>
|
||||
<action dev="POI-DEVELOPERS" type="add">Improved how HSMF handles multiple recipients</action>
|
||||
<action dev="POI-DEVELOPERS" type="add">Add PublisherTextExtractor support to ExtractorFactory</action>
|
||||
<action dev="POI-DEVELOPERS" type="add">Add XSLF support for text extraction from tables</action>
|
||||
|
@ -173,23 +173,6 @@ public abstract class POIXMLDocument extends POIXMLDocumentPart{
|
||||
*/
|
||||
public abstract List<PackagePart> getAllEmbedds() throws OpenXML4JException;
|
||||
|
||||
/**
|
||||
* YK: current implementation of OpenXML4J is funny.
|
||||
* Packages opened by Package.open(InputStream is) are read-only,
|
||||
* there is no way to change or even save such an instance in a OutputStream.
|
||||
* The workaround is to create a copy via a temp file
|
||||
*/
|
||||
protected static OPCPackage ensureWriteAccess(OPCPackage pkg) throws IOException {
|
||||
if(pkg.getPackageAccess() == PackageAccess.READ){
|
||||
try {
|
||||
return PackageHelper.clone(pkg);
|
||||
} catch (OpenXML4JException e){
|
||||
throw new POIXMLException(e);
|
||||
}
|
||||
}
|
||||
return pkg;
|
||||
}
|
||||
|
||||
protected final void load(POIXMLFactory factory) throws IOException {
|
||||
Map<PackagePart, POIXMLDocumentPart> context = new HashMap<PackagePart, POIXMLDocumentPart>();
|
||||
try {
|
||||
|
@ -217,7 +217,7 @@ public abstract class OPCPackage implements RelationshipSource {
|
||||
*/
|
||||
public static OPCPackage open(InputStream in) throws InvalidFormatException,
|
||||
IOException {
|
||||
OPCPackage pack = new ZipPackage(in, PackageAccess.READ);
|
||||
OPCPackage pack = new ZipPackage(in, PackageAccess.READ_WRITE);
|
||||
if (pack.partList == null) {
|
||||
pack.getParts();
|
||||
}
|
||||
|
@ -34,23 +34,9 @@ import java.net.URI;
|
||||
*/
|
||||
public final class PackageHelper {
|
||||
|
||||
/**
|
||||
* Clone the specified package.
|
||||
*
|
||||
* @param pkg the package to clone
|
||||
* @return the cloned package
|
||||
*/
|
||||
public static OPCPackage clone(OPCPackage pkg) throws OpenXML4JException, IOException {
|
||||
return clone(pkg, createTempFile());
|
||||
}
|
||||
|
||||
public static OPCPackage open(InputStream is) throws IOException {
|
||||
File file = TempFile.createTempFile("poi-ooxml-", ".tmp");
|
||||
FileOutputStream out = new FileOutputStream(file);
|
||||
IOUtils.copy(is, out);
|
||||
out.close();
|
||||
try {
|
||||
return OPCPackage.open(file.getAbsolutePath());
|
||||
return OPCPackage.open(is);
|
||||
} catch (InvalidFormatException e){
|
||||
throw new POIXMLException(e);
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
||||
* @param pkg the OpenXML4J <code>Package</code> object.
|
||||
*/
|
||||
public XSSFWorkbook(OPCPackage pkg) throws IOException {
|
||||
super(ensureWriteAccess(pkg));
|
||||
super(pkg);
|
||||
|
||||
//build a tree of POIXMLDocumentParts, this workbook being the root
|
||||
load(XSSFFactory.getInstance());
|
||||
|
@ -88,7 +88,7 @@ public class XWPFDocument extends POIXMLDocument {
|
||||
private XWPFHeaderFooterPolicy headerFooterPolicy;
|
||||
|
||||
public XWPFDocument(OPCPackage pkg) throws IOException {
|
||||
super(ensureWriteAccess(pkg));
|
||||
super(pkg);
|
||||
|
||||
//build a tree of POIXMLDocumentParts, this document being the root
|
||||
load(XWPFFactory.getInstance());
|
||||
|
Loading…
Reference in New Issue
Block a user