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

@@ -408,7 +408,7 @@ public class HemfComment {
public static class EmfCommentDataWMF implements EmfCommentData {
private final Rectangle2D bounds = new Rectangle2D.Double();
private final List<EmfCommentDataFormat> formats = new ArrayList<>();
private byte[] wmfData;
@Override
public HemfCommentRecordType getCommentRecordType() {
return HemfCommentRecordType.emfWMF;
@@ -439,12 +439,16 @@ public class HemfComment {
// WMF metafile in the WinMetafile field.
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
leis.read(winMetafile);
leis.read(wmfData);

return leis.getReadIndex()-startIdx;
}

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

public static class EmfCommentDataUnicode implements EmfCommentData {

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

@@ -20,6 +20,7 @@ package org.apache.poi.hemf.usermodel;

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

import java.awt.geom.Point2D;
@@ -39,6 +40,7 @@ import java.util.List;
import java.util.Set;
import java.util.stream.Stream;

import com.sun.xml.bind.api.impl.NameConverter;
import org.apache.poi.POIDataSamples;
import org.apache.poi.hemf.record.emf.HemfComment;
import org.apache.poi.hemf.record.emf.HemfComment.EmfComment;
@@ -48,6 +50,9 @@ import org.apache.poi.hemf.record.emf.HemfHeader;
import org.apache.poi.hemf.record.emf.HemfRecord;
import org.apache.poi.hemf.record.emf.HemfRecordType;
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.RecordFormatException;
import org.junit.Test;
@@ -284,6 +289,35 @@ public class HemfPictureTest {
}
}

@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
public void testWindowsText() throws Exception {
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