From d71e92ace2cd7fe60d6368caa95e8d21cd5b6e5e Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 20 Sep 2010 11:45:53 +0000 Subject: [PATCH] Apply patch from bug #49820 - Fix HWPF paragraph levels, so that outline levels can be properly fetched git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@998897 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../hwpf/sprm/ParagraphSprmUncompressor.java | 9 +-- .../apache/poi/hwpf/usermodel/Paragraph.java | 15 +++-- .../hwpf/usermodel/ParagraphProperties.java | 2 +- .../poi/hwpf/usermodel/TestBug49820.java | 63 ++++++++++++++++++ test-data/document/Bug49820.doc | Bin 0 -> 23552 bytes 6 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBug49820.java create mode 100644 test-data/document/Bug49820.doc diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 9123d65c13..f1b71436e1 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 49820 - Fix HWPF paragraph levels, so that outline levels can be properly fetched 47271 - Avoid infinite loops on broken HWPF documents with a corrupt CHP style with a parent of itself 49936 - Handle HWPF documents with problematic HeaderStories better 49933 - Support sections in Word 6 and Word 95 files (HWPFOldDocument) diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java index a6b12ec2da..695de59646 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java @@ -337,11 +337,12 @@ public final class ParagraphSprmUncompressor } break; case 0x40: - - //newPAP._lvl = param; - if (newPAP.getIstd () >= 1 && newPAP.getIstd () <= 9) + // This condition commented out, as Word seems to set outline levels even for + // paragraph with other styles than Heading 1..9, even though specification + // does not say so. See bug 49820 for discussion. + //if (newPAP.getIstd () < 1 && newPAP.getIstd () > 9) { - newPAP.setIlvl ((byte) sprm.getOperand()); + newPAP.setLvl ((byte) sprm.getOperand()); } break; case 0x41: diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Paragraph.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Paragraph.java index 087c6c5c16..87fe4d7f1d 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Paragraph.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Paragraph.java @@ -435,14 +435,19 @@ public class Paragraph extends Range implements Cloneable { } public int getIlfo() - { + { return _props.getIlfo(); - } + } - public int getIlvl() - { + public int getIlvl() + { return _props.getIlvl(); - } + } + + public int getLvl() + { + return _props.getLvl(); + } void setTableRowEnd(TableProperties props) { diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphProperties.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphProperties.java index 8944eb0600..8ab3d904a1 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphProperties.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphProperties.java @@ -35,7 +35,7 @@ public final class ParagraphProperties extends PAPAbstractType implements Clonea this.field_17_fWidowControl = 1; this.field_21_lspd.setMultiLinespace((short)1); this.field_21_lspd.setDyaLine((short)240); - this.field_12_ilvl = (byte)9; + this.field_58_lvl = (byte)9; this.field_66_rgdxaTab = new int[0]; this.field_67_rgtbd = new byte[0]; this.field_63_dttmPropRMark = new DateAndTime(); diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBug49820.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBug49820.java new file mode 100644 index 0000000000..4e96646f44 --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBug49820.java @@ -0,0 +1,63 @@ +/* ==================================================================== + 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. +==================================================================== */ + +package org.apache.poi.hwpf.usermodel; + +import java.io.IOException; +import junit.framework.TestCase; + +import org.apache.poi.hwpf.HWPFDocument; +import org.apache.poi.hwpf.HWPFTestDataSamples; +import org.apache.poi.hwpf.model.StyleSheet; + +public final class TestBug49820 extends TestCase { + + public void test() throws IOException { + HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug49820.doc"); + + Range documentRange = doc.getRange(); + StyleSheet styleSheet = doc.getStyleSheet(); + + // JUnit asserts + assertLevels(documentRange, styleSheet, 0, 0, 0); + assertLevels(documentRange, styleSheet, 1, 1, 1); + assertLevels(documentRange, styleSheet, 2, 2, 2); + assertLevels(documentRange, styleSheet, 3, 3, 3); + assertLevels(documentRange, styleSheet, 4, 4, 4); + assertLevels(documentRange, styleSheet, 5, 5, 5); + assertLevels(documentRange, styleSheet, 6, 6, 6); + assertLevels(documentRange, styleSheet, 7, 7, 7); + assertLevels(documentRange, styleSheet, 8, 8, 8); + assertLevels(documentRange, styleSheet, 9, 9, 9); + assertLevels(documentRange, styleSheet, 10, 9, 0); + assertLevels(documentRange, styleSheet, 11, 9, 4); + + // output to console + /*for (int i=0; id=FFTkGw06SJ2Q9gmY-`^ zvwFKhEs+WX35$GaQYMNLat83->9`glJ%LBrho+_`6k7m*m52W#57e(aLRcw=Y(g5e zOYtHS0#_CShmcx;1__=VJlSWK&n!yX=Esn&M{G3+vDal#_@ooH$&GzOvsEICr!)LS zF(E3=aioPEn)yGXy0kh_ya*UQ+@kk6ss`z&Ass25?q)#9Ylv61==~YpsSlYUNYk>8 zgfKyV3Mhszp=OZJ*^rPmpm?hjA>I&w1p4jKfK;IUK$k0({7HT2d^AP7l7Y5IQ@Y)B z9*kdu2owCH2XuCezBEPq>mgm*j&vOTBN=ErlCm%1>Gu4Yy}xQ-Rvl=2w4dny7PR;hS1X{{|1i+@ZH=4bBFKkBlaABr&8dI?m$pk= zqOTX0V+%ss&orgWr{grG^<_~ypERZWBTZ%L({j3eIxdS!mqW*CKhtqpl(tJ>UupVh z>C*ZCS#kP$$*Q+3IbGkcrLyedy;%cppmET-`$4Z)AlmSYPZW9h&-Z|vkRK8e6UMbx zr#YKeu1_mx+sfIsa`vs9Lo4Ul%Jo$rEDD*<6$__{xl<#=;oO86K{!7qOc=ryC5WRU zVuai%VWKcfI$N7WF0CRKaYtfqsHT+JKgn;W{-1vd{=GGXIi4~=1&{&Q4%h{#0pR@a zb;IlW*Y$V)y>*nA{skUTYagD}v4H4NzeKTxYUqV~s!bx%Zp!R<0D(B>qT@<9&&O-8 z3or&)0BitGfMEbnz(hbQ0Q&~^iQgq_^FlJxAQ^cm8M!MNX|qtcE}2p(896T*IU^Y< zlZ+gZjQscUu)=mWXNQGcGbzW_wzD}23&Bf7;0a1|%B>uyl~Zcv6k9okR*v1uv06E1 zE61QYH5+1`6VB)ti=Cu%aTsepi9nN1v5a`VnR9;A7|u zqj_0WGQX@m(sJ6j((?bscrmNl$2QQ9a3kd~#LEFSfCd2G1+@TNfEBn25`Wi`hanOSpeL<2y|nxqumVIF@Si0 z7yx481edC@i3wB+QK-(aArW-IMCLV z(B_j65=$aTJmC^+(Ch$rFhw(lPC*0FEpWnTXi$a`gKx$nI>e5{aCJ8#BixM0Xm=*@ z0uUd>s?=Ot zxbe6XcB?II8Mbg&rUPNOwZ)RMWrWv2fwG0yKu3lxJFvxpwL5qbW+N(uY8sdLLnDbI zrEL$|x-zuwDQ(4OZ3Q-Qb=N2Th!UmO5A@p0&~u>ll$!MvmB_#z;7~5Mp3~ZTJsG-= zpxXiJOkH;;(*A@3fxZdXUWsqUfM*$X-QkwvOq3~G&QOmIGHmq)MO6ZCJFxW})K_WN z=aNYr#xUZ-ecH5|3?phS%SkOL*%NxO5c**v^yMhvV#ovNjj`kr^vYGWWLW9b#tL3#$^`T_Y>5e_%a);Q`#D`|e4ws11I7o8fX{ouu8l5^4=5MMN2)zl zvI~q8HJHDDUfaHnHa$MDR4=N=N;32u+UR{8AI+`hQ@R`(x{gx1l&4@kI8pVTLbX;| zhHl?Bx;Pf7)=uK2+7MIdDNJGmqlvzsE5KL~wcL+!|4*Obo%iFt%yR^btqZ=vd5;N6 zn|DA5SCB? zT{C=YayGE>b`uv&x2Kco%9z+Wp^pKu4FbnBH1YQ zjzNE&!?T>T?v_|QUhv|$+sek{`nxvJy0l=b0H zTytLQXicx;Ay!J0XWj2pU2-oG>ch zl83(;+2_DTYFSS*52jZnd!0X~-!;*4U5=~e+GJ8|F+1GU@S5SnYop5)RrYf-3ZA^$ zG~h$g{5Q2r?s4^2Y*svW%XQGN;kAhaN@u5?$}HH>mE$)p_S>~d*LDXU@T^$tbjI3n zom+|3589e@u8cn5T{JkP;*{2T_o3HpgUx1dSU4rHvUBdLjy3ipFTBw6u5<`0%HDXY zY3DJk)2l`wnZ2#oouTX)hb1E;ZU?X4XjwPrV9rM2=8MMVyZ5}g{Qk2IjhwzzFC7{< z4*&y_h{J`^LQ9F?QT!Nwm@p1IhuY~;D#y55&b7&_r{-L75bU=Y8ocAzqWv$4>q-Nc zvi$QuUaP!Qm+o-3TK7`k2=xiQRw}8_6Q1GC`Ke)MuMLJ9ueuri+$*ZKto_{w)AUd6 z`c9{M_{n&$0~THJdzO{x`n&FTCo0Yv{wC<|<6b&sRR? zn@OAUV4CR#FYa*3AW`k+CRk&&>nDsBU9;CM)vTJz6^jJj5)G6R=2dOa+d9hdcubaY z#N4G-o@<=X4^K9{T9?8&wvV6HzA8FvwO^`U)w=$V)`mPRPH-+gYCL?no?!a$t3f?W ze$R2co&BUKX=VX0aBqh`V&{wkr--B%^X)Vj9>2#Jb+lw^WL0VLU6W0*+Ce9D&c9qg zWQMQ(&Dl?E0({%eRZe>`cT!ojrFReiz=?|nstKkq++dcv*SdrCxP~4_*E!d?<{R!@ zcV}XBLiZE4jh<-&?*3z!&Sh(spJ~kf{rI($n_lS`yDhoM8mPk>l@~I?y(*}*s9ju- z{Uh^Pr>`1Ysl2Yuxjx1?czloC@Fcru&z9QrENfpxwHu>)dFkaBXDt1e_2#@>rarpe z_bTgO%vzfeu_a$bMxLpgaWLQ~U(5R)$;;&Oi@$iUzjA-urT%@-XrCN-_QK=KD|UZ7 z-?Acb`Qp8o9*9?L9jQ0sVoJS0piw%`FFK0Xe;RAY>$^sWDz4Ng`gS_NnDFj5qeHVd z?YPA9LRb-v3L48Pc8MK;s`y#s*OXp>(%X_^qi5O zs@8J_*KX7){kK{t{Ef2NKd)c}blYPq$eP*LpO-z|6cdN!Lsu#ukV%#-)*a&{q)z- zKl-vvl0$DDc>VO0=-jFUuYbExU79qWQLQ`8=UdH)k!Jf`G%Ad38;Ne0=M8qe!%9@Qu^Q&U+m&Z1>G+|8I3N zT^DI(J~yiFRxo&f|0VqrZ>&C4vnad$K36ZL3+{{69-N%J{>qwYgY>}lWBa9-cDh!7 zeORZnn|IwbRpM#yVD40@&C2K-dSG5Rm9nvBS&pH?^uV$no3-Pt+Ry4(xmd-illBQO zORo30t$VvWS1-D-jlXgH4>8sJ3spl^hQ8Vo9#FP&*+RdWrG~YRTaRjlYyYsl^T}k6 z*Mh{oo70}eI=DXX|C-TF^+s}@cG-E`M64X857?k-^232*PS9knAP+4TOg{D83U zvkDxo*R^vBO}KF+lbL7d7W<;z*b45^?zUA4qji*p!}=|;xTCF+7`kUs$qCoRMfKZ@ zH)*Ps7`qiFP7BKNeI7fDXK^z3hPiFlxs?_3%ws2p_FQJOCjaF_t1XeMJ68PaFn z+1ha%)dsHgRaaDv9L!3~k7o4Tc9h}2^V@XgP_y#HpOQq6_3AR8i5D)2b++joaqwQU zkAufAf}gLmo$GyGyLEo*Q9N<3--yM@te6c`yqEh682hg$iEgcPN(&1(KRu~erwQI3 z9!v9&l~hjVISja6x9ib&wIfxtr>F!h+js9+uZ%pCKxM<1-OP8Mdb-@fZ*Opn_Ql#2 zN3SM(@Hc1_4Bp(kR~JKr&>pIcrQsgqKHM?SeQ`jyc;N>F@4`YCt9Oy!DV_W)7d7U- z-dtaQeoo0hlFztz|Ixx!(JOY&uqe})R(k@odfeCXRQAbYoqf|?pMBx3-kTC;9cKM-WqjH%X`cil$w|J zgLBg1tfWb)3(r=Tlx5Cy^jU4YW>%ncUC?BuA*$DZK5ENuf89KWeSO z){IHA9g=o*R)ML@N#2sKI?3I%wuB`u>w3y&u=yJITfbbKH^5XWLp?!#(xs&RS*DzX zF{5_a1jUxsol8Dv6R!K4`G%Du5B2UZ1M*l+;(LO{9hbyCERG0|d)vWuT>a+6gA-Og zIVc?Z{CMG+$+sskPP_ZL^c?ZFQnz-2-`1_;;|(kw;%g7je`atjs6uO9Y<2qc&Q(nt z8*Y@a?6Bdl*&;n-HcahQ#m5hg?(BJ&2P*p-+GaiaobMaevp}0{Ui0FUL0N)|IqS? z{mcGwN=IOG(>i>!0jJ-CAEvB061}JXduMMwkGWU+hZF~;eJ^r&)IMzC2#ZnXX5JP& z>)bevZtja$me2EflTzfkHhbJ{)3xhePVO&vdzFx!-8{z|5T#hMeRYr5oZ9?Aa2Z{NP-)vZluFnhxWhOEgcWRnP=nW}n@ zXlp=v%JxyaC-_rh0w=8~Jq7xxs0$P2Pv#U7?w7VCJs#Gn#*6teA^a#&jBtSIbYZ;dpn>WtPW*m?sJK!5SS}cdiSNfBU>YtK$M&}ZJ{EwQI1_NLr$ zcqbkSEka_-4HZSXH4A9Y)N&yDvKG*;c{{%Ogc~fX@SU6jCbsbCbU10(fIB3FC^o>N zk1!z(u0E{YJ_6&;#JCX_a$pO7NE1m(Ng=OrD^8Oz8y0~`i*Oo1w^p0X7+c zvKuTYxpD&j88sP;V$V8uplCAl(k^Fo}W!gUL`*WGbMKFwm7pJ_Ucq zz|L_r?3CgD8zFsoROzaUY$gVorMtjBRs@uUIxfvMW-CCA6 zb%p#`QnMzPjDolr_QVM6hOo&L&K!NxfbT^&p)1LSiu>Qz1CVD^o!X3GNo-XGsRd>Tw}kVyqC*e+qU%BBH_phG@97Mhy0 z>1Yd8AtT6eG8)DY7senDdNmKm(C4L6s`BXnGY@=#dpO)^KWP>A>6*+RpS~F#uC-+$ zhxF{W^9l|qF(knJgL>%X07XrF*kT_n0ALp_2H%* z-_!z%Q$s7DcoN?UD89sS0}3+);sX@F9GC=D3up*X+&PW{isj>|!YKrnjX|16nb02#qmU+rc3H!UJsl^%cd1 zfZQ2C0?KzFamJtDH(K3<)8Q0fzOM*RilgtKDU=UQTIk^x3Pc{{9*}!L?g6<6-`J>uJ;!JaF1XKpaWnf0FN&f0C4?Y2*C9_Zp7n(nF9b^?;i)C?FxY8x*lbc z>vzfZGQDoDfjlTj3s@EgS=1ORfqDq)7#kLb3wf-(N9_zzB4vt728le#Js|gh+yinC z$UPwUfZPLe56C?r_ki33au3Ko@L%r%T;$^N7uU{g0IuV48I14i@qZohJw3jg$F(%B z!*QLC@8ogak862c=i@tkT+izQ+5>P+kL!Nahd&P^1_1arhWfGxKYYZcc4q*ln*cQh zbOD$Fx&q7r-2j;W9?+wO$2dYB{&^n2b9W**%f=-`;q09l&H~}r*k2y>;PePx8|*`h z%GjF-IZXY+hout1)8h^G&v?B+cDO}u4W|L|Yghb&_OApD!lcT_ev9?^5*v61h5q+6 zUub%!;zI4mKu0D<}{{Ncxb0x}Wz&F8o@-r6BqXm=6nDSLY z8}43o*