mirror of https://github.com/apache/poi.git
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:
parent
ad11a5d363
commit
a5278ccad9
|
@ -408,7 +408,7 @@ public class HemfComment {
|
||||||
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;
|
||||||
|
@ -439,12 +439,16 @@ public class HemfComment {
|
||||||
// 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 {
|
||||||
|
|
|
@ -20,6 +20,7 @@ package org.apache.poi.hemf.usermodel;
|
||||||
|
|
||||||
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;
|
||||||
|
@ -39,6 +40,7 @@ import java.util.List;
|
||||||
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;
|
||||||
|
@ -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.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;
|
||||||
|
@ -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
|
@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")) {
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue