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
This commit is contained in:
Tim Allison 2019-04-08 19:53:21 +00:00
parent ad11a5d363
commit a5278ccad9
4 changed files with 41 additions and 3 deletions

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 {

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")) {

Binary file not shown.

Binary file not shown.