blob: cc5406acf75f65df88e4f3a4d1b4684258d57553 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
/*
* 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.
*/
/* $Id$ */
package org.apache.fop.render.intermediate;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.fop.fonts.FontCollection;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.fonts.FontManager;
import org.apache.fop.fonts.base14.Base14FontCollection;
/**
* Abstract base class for binary-writing {@link IFDocumentHandler} implementations.
*/
public abstract class AbstractBinaryWritingIFDocumentHandler extends AbstractIFDocumentHandler {
/** The output stream to write the document to */
protected OutputStream outputStream;
private boolean ownOutputStream;
/** Font configuration */
protected FontInfo fontInfo;
/** {@inheritDoc} */
public void setResult(Result result) throws IFException {
if (result instanceof StreamResult) {
StreamResult streamResult = (StreamResult)result;
OutputStream out = streamResult.getOutputStream();
if (out == null) {
if (streamResult.getWriter() != null) {
throw new IllegalArgumentException(
"FOP cannot use a Writer. Please supply an OutputStream!");
}
try {
URL url = new URL(streamResult.getSystemId());
File f = FileUtils.toFile(url);
if (f != null) {
out = new java.io.FileOutputStream(f);
} else {
out = url.openConnection().getOutputStream();
}
} catch (IOException ioe) {
throw new IFException("I/O error while opening output stream" , ioe);
}
out = new java.io.BufferedOutputStream(out);
this.ownOutputStream = true;
}
if (out == null) {
throw new IllegalArgumentException("Need a StreamResult with an OutputStream");
}
this.outputStream = out;
} else {
throw new UnsupportedOperationException(
"Unsupported Result subclass: " + result.getClass().getName());
}
}
/** {@inheritDoc} */
public FontInfo getFontInfo() {
return this.fontInfo;
}
/** {@inheritDoc} */
public void setFontInfo(FontInfo fontInfo) {
this.fontInfo = fontInfo;
}
/** {@inheritDoc} */
public void setDefaultFontInfo(FontInfo fontInfo) {
FontManager fontManager = getUserAgent().getFactory().getFontManager();
FontCollection[] fontCollections = new FontCollection[] {
new Base14FontCollection(fontManager.isBase14KerningEnabled())
};
FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
fi.setEventListener(new FontEventAdapter(getUserAgent().getEventBroadcaster()));
fontManager.setup(fi, fontCollections);
setFontInfo(fi);
}
/** {@inheritDoc} */
public void startDocument() throws IFException {
super.startDocument();
if (this.outputStream == null) {
throw new IllegalStateException("OutputStream hasn't been set through setResult()");
}
}
/** {@inheritDoc} */
public void endDocument() throws IFException {
if (this.ownOutputStream) {
IOUtils.closeQuietly(this.outputStream);
this.outputStream = null;
}
}
}
|