Browse Source

bug 63327 allow retrieval of wmf data embedded in emf

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1857136 13f79535-47bb-0310-9956-ffa450edef68
pull/145/head
Tim Allison 5 years ago
parent
commit
98ceb1fb0f

+ 7
- 3
src/scratchpad/src/org/apache/poi/hemf/record/emf/HemfComment.java View File

public static class EmfCommentDataWMF implements EmfCommentData { public static class EmfCommentDataWMF implements EmfCommentData {
private final Rectangle2D bounds = new Rectangle2D.Double(); private final Rectangle2D bounds = new Rectangle2D.Double();
private final List<EmfCommentDataFormat> formats = new ArrayList<>(); private final List<EmfCommentDataFormat> formats = new ArrayList<>();
private byte[] wmfData;
@Override @Override
public HemfCommentRecordType getCommentRecordType() { public HemfCommentRecordType getCommentRecordType() {
return HemfCommentRecordType.emfWMF; return HemfCommentRecordType.emfWMF;
// WMF metafile in the WinMetafile field. // WMF metafile in the WinMetafile field.
int winMetafileSize = (int)leis.readUInt(); int winMetafileSize = (int)leis.readUInt();


byte[] winMetafile = IOUtils.safelyAllocate(winMetafileSize, MAX_RECORD_LENGTH);
wmfData = IOUtils.safelyAllocate(winMetafileSize, MAX_RECORD_LENGTH);
// some emf comments are truncated, so we don't use readFully here // some emf comments are truncated, so we don't use readFully here
leis.read(winMetafile);
leis.read(wmfData);


return leis.getReadIndex()-startIdx; return leis.getReadIndex()-startIdx;
} }

public byte[] getWMFData() {
return wmfData;
}
} }


public static class EmfCommentDataUnicode implements EmfCommentData { public static class EmfCommentDataUnicode implements EmfCommentData {

+ 34
- 0
src/scratchpad/testcases/org/apache/poi/hemf/usermodel/HemfPictureTest.java View File



import static org.apache.poi.POITestCase.assertContains; import static org.apache.poi.POITestCase.assertContains;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;


import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;


import com.sun.xml.bind.api.impl.NameConverter;
import org.apache.poi.POIDataSamples; import org.apache.poi.POIDataSamples;
import org.apache.poi.hemf.record.emf.HemfComment; import org.apache.poi.hemf.record.emf.HemfComment;
import org.apache.poi.hemf.record.emf.HemfComment.EmfComment; import org.apache.poi.hemf.record.emf.HemfComment.EmfComment;
import org.apache.poi.hemf.record.emf.HemfRecord; import org.apache.poi.hemf.record.emf.HemfRecord;
import org.apache.poi.hemf.record.emf.HemfRecordType; import org.apache.poi.hemf.record.emf.HemfRecordType;
import org.apache.poi.hemf.record.emf.HemfText; import org.apache.poi.hemf.record.emf.HemfText;
import org.apache.poi.hwmf.record.HwmfRecord;
import org.apache.poi.hwmf.record.HwmfText;
import org.apache.poi.hwmf.usermodel.HwmfPicture;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
import org.apache.poi.util.RecordFormatException; import org.apache.poi.util.RecordFormatException;
import org.junit.Test; import org.junit.Test;
} }
} }


@Test
public void testWMFInsideEMF() throws Exception {

byte[] wmfData = null;
try (InputStream is = ss_samples.openResourceAsStream("63327.emf")) {
HemfPicture pic = new HemfPicture(is);
for (HemfRecord record : pic) {
if (record.getEmfRecordType() == HemfRecordType.comment) {
HemfComment.EmfComment commentRecord = (HemfComment.EmfComment) record;
HemfComment.EmfCommentData emfCommentData = commentRecord.getCommentData();
if (emfCommentData instanceof HemfComment.EmfCommentDataWMF) {
wmfData = ((HemfComment.EmfCommentDataWMF) emfCommentData).getWMFData();
}
}
}
}
assertNotNull(wmfData);
assertEquals(230, wmfData.length);
HwmfPicture pict = new HwmfPicture(new ByteArrayInputStream(wmfData));
String embedded = null;
for (HwmfRecord r : pict.getRecords()) {
if (r instanceof HwmfText.WmfTextOut) {
embedded = ((HwmfText.WmfTextOut) r).getText(StandardCharsets.US_ASCII);
}
}
assertNotNull(embedded);
assertEquals("Hw.txt", embedded);
}

@Test @Test
public void testWindowsText() throws Exception { public void testWindowsText() throws Exception {
try (InputStream is = ss_samples.openResourceAsStream("SimpleEMF_windows.emf")) { try (InputStream is = ss_samples.openResourceAsStream("SimpleEMF_windows.emf")) {

BIN
test-data/slideshow/60677.wmf View File


BIN
test-data/spreadsheet/63327.emf View File


Loading…
Cancel
Save