From ae46efb522580d62b1d0efd47579cfa04a6214f0 Mon Sep 17 00:00:00 2001 From: Nanou Persoons Date: Sun, 3 Nov 2024 09:11:08 +0000 Subject: [PATCH] Add test for decoding filter with FlateDecodeFilter bug Add tests for bug related to KeepTogether and KeepWithNext usages DEVSIX-8696 Autoported commit. Original commit hash: [2ac55dcea] --- .../itext/kernel/pdf/PdfReaderTest.cs | 13 ++ .../encryptedDocWithFlateDecodeError.pdf | Bin 0 -> 5714 bytes .../layout/KeepTogetherDivAndTableTest.cs | 131 ++++++++++++++++++ .../cmp_combineKeepTogetherDivWithTable.pdf | Bin 0 -> 3860 bytes .../cmp_paragraphTableSameDivKeepNext.pdf | Bin 0 -> 1760 bytes port-hash | 2 +- 6 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/encryptedDocWithFlateDecodeError.pdf create mode 100644 itext.tests/itext.layout.tests/itext/layout/KeepTogetherDivAndTableTest.cs create mode 100644 itext.tests/itext.layout.tests/resources/itext/layout/KeepTogetherDivAndTableTest/cmp_combineKeepTogetherDivWithTable.pdf create mode 100644 itext.tests/itext.layout.tests/resources/itext/layout/KeepTogetherDivAndTableTest/cmp_paragraphTableSameDivKeepNext.pdf diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs index 1d3fa66614..26bc038575 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs @@ -2623,6 +2623,19 @@ public virtual void ReadAandUaDocumentTest() { } } + //TODO DEVSIX-8695: Update after bug is fixed. + [LogMessage(iText.IO.Logs.IoLogMessageConstant.XREF_ERROR_WHILE_READING_TABLE_WILL_BE_REBUILT_WITH_CAUSE)] + [NUnit.Framework.Test] + public virtual void TrailerMissingBytesTest() { + FileInfo file = new FileInfo(SOURCE_FOLDER + "encryptedDocWithFlateDecodeError.pdf"); + PdfReader pdfReader = new PdfReader(file); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + PdfWriter pdfWriter = new PdfWriter(byteArrayOutputStream); + Exception e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => new PdfDocument(pdfReader, pdfWriter + )); + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.TRAILER_NOT_FOUND, e.Message); + } + private static PdfDictionary GetTestPdfDictionary() { Dictionary tmpMap = new Dictionary(); tmpMap.Put(new PdfName("b"), new PdfName("c")); diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/encryptedDocWithFlateDecodeError.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/pdf/PdfReaderTest/encryptedDocWithFlateDecodeError.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a0f6750ccd492b4deeda9cef4155e76c619b6e3e GIT binary patch literal 5714 zcmcgw2T;@7vqp*n(m|Slp$RCGgancZQW6Ng_aY`hC;<~pLQ_E$M0y87ngS|HxhMz- zN|7o^FBb#_sZs<)s(`-W)vNQa_r3Ygym@CP`TZs*XZPE0zdbX%lExb7Q(!q5tK`IF zS05`g0ssOK9r3Kn%0PX00uD=Zzld`NfPwk|1sE6#Gy;I-ftmm?6buF$0_1__00k&W z9;gkl13(qv05DA9tcnUNj^Mm+1Mu6$$_!Tc=|ltPM0Ca(V@c=9RF^2Cr}udR82|wq zlW@-NP81@E>QF@ms7Y`l`Fl|S05FJp))a_#_oU!RK(r^8g8Rz^P)EZ~SpyA4B2bFz znox+QJQ5B?A)sJ+kfI_Cg+gnhpePk(BupIzLn%N|P$-=GHzZsUfrLU}2qYS)eOJZo#L!yL}Ld0_6jKFgKY zsr&*i@_VkMhdD4bW-SLpiftjr)*W=Tm+BQz`X4~nU*!hW*) zJ9+>x2=IFl2t}Y7HD5o0y~ydFfg6nS#p%<&2vt7@Yj+{yQ zs@os`o?Yw`88nuzszx{tZ9Y03)bf7a#L~xiFMZf0mu2ZA7jutLEbjk=v@yEI-@F??63Fo^EaBWS z2R&06pfTVS1cHzUngXCy=jYLXA)tPfe!N;pSF-haZajH!e6ZU&e+k2hqxo-3251R@ z{#5)oEqo8k07t<(V<}hwv935WU_VEue`y3o-SZ^6{&JWqmLIi;A`&Q63dqz- z`*s3FB6=Z-es=rnS3oEL;86LqKm%%tVE^$ewU($Szk4#pk%`_UC)|EZM5X`~e&m9xG(+m`@y(8r zBc4k0Ptn;~Ov@HzSV|+pzzB{n+t|P%WxU^7^0faA(AJ4#%wXcp<)NS+>W}mih4Y|k+izcY2)ON4=m;VmbPfUNOeP0Tu z!2g4+Q_JK(PVp}~{LaXJ!Tq?zN>e4h7{ZmF+C~R?7++-_`AtN>NaVW#h&&VyH1l?( ze7hYD^#4-Cj}rN5ob(*|=(fJm%MS3l^7w~GMfq|0gJ}ot=_d=Nq=}Bj_lp%38;{zC z?PgfQjRc(nZEzW&|Ss;iZc$>gj%^6(!TcwA|Vo;gVHrg(6iM#1L*I7W_7J>qKF(xk?BR4F-wriJ~7CjLw==PwN6rqLM@K9zpSvzxQqDK}f!g?ooj*4}vi`R%#d+!ON}>Ga!aOhUNNbscl$yh8)m zX8-ICn^5{{4oVx5+_I>lIlO_OwQSLIDb&o0t#Dd#>OJIVZ`$!?r+$5BMIm?2@iZ%j zV$kkaaMAI2d!hf#LiZUJhQxNItA??=ErIgBjbYQg3vE^5ZLS*+?qNbVa9#$s!t~GI z2PY#zSN_a5^YCKpkP5QDe*=cdN$4-l7ppHFdMs*(>2;*#d^%GT)0!SigG=(`wcSz_ z2nTJ+Ffy#aiSwAqPw~8Ny^w9B=CBrI47t0+B7)u019?^ERS*(+!CXVE*ETRGIEz@74HV#dKXw^D8|2gk$dU$lz&4` z%7jPZxZtG3NkR3UMF3<|CQwChge>vJq&P?Z3Q$YcGaajY?&{6as`H@ynlsv86lA7U zCDq|Z+K;2Mn`tll7MB<yPS;W#Zf>1MP);zHH)Bf?0|y*sHmDm97_6Bck%sAoTuB zG7oomOz30jhe+KFf1&EW{AgZ@cUuiqEI@1;G{=PTm`?CiXBQ3mf}YjCd5pV|+YVJ}^azHk)&r?|lZ z*y8#n{^l_kzk)fN!xai*iab*HP%p!a6N}wy(uf|G(zoUN4?1J+R)xuR9?WQlJPCCL z=njh)n8A1L_|rTtfFTu6w&&a}8!@k<3dt1D?CT8*$M0v}I@M5n+lww~WmAB?`yOBk z54fefDbv9Y%_w(cZzkf(KOTE^OTyN<7kiESqj{ru8DohRqZvt$7~R`nEn;=(W<#lE$G68JLGH8+};SPbH3sInNeHTyIFxbcF^I@Gn)01#ju_MdTlnIU5nX z_SUv^l3y`ku}^2Xx46Z@E&62rpo+jljx7;Ae+d@AF7uV^eDmgULnBy55mnsSGt!oI zYE`BtLAh^ph3Q_UNv|fX>EikpF-gb5$9i}pSw@yI9voWYv;%ljULVD(|JC7ooBf@2 zmuy1K0COAq?$pEV!@B3<8QGm6*pbS<>Qa^j&Euitv)6E5Zv7=0@K3WstBzkMNke?q@G=6utqyb}_V836*WCp?v{l85L0WIxh4q%VY1;|(DcJRVrw?&R*B*b3^a5?RPuwjxu~cAq9-cO%WL7BO!wImIlg2D7d!`Fmq89dC z6^W&2-u9w4?Z$waRm=8Ml{RM@h3^R>kKdGiVTi(roWNi4DLR%;<34tz2;`5M!Wo|2 zy3P6;lKPxJb(KxrnD&j<74$9hZq4}EzSqk3oQy_7yl1i!o!%YP=~hK)nHbk5C#DJ4 zy-(1heNR*u##MQ`JQ5$RY*`3-spK#?-+J03scZcW`>}v$9OdJ5Eti`Yc-Gi?jW-oa zQCa8)jgrjOq-SqZBuaC9>(deJXnw7(F?Nx}Soz#lq&0_9Wi~ocR$Zqr?`YOTf3v{P z?#v_gP%qEh(!*I=Vr@@7Bdj}tqY*uto*b(eAwp68QMHNMp3MVTwT-nkmaj&+?1wT* z!+c`NbW+%HB=Fgw-ri0gX>qVKIgLW6=cS6am0~MEpQh(9*-iA(J&)$i`tT8cqzs%X z)Mr`GTg8zc3%ce|WNo6=_|mifRaOP#Q85)AuC8DUIl!`f-&|e;3pu+?dW|zzyR68z zH^8oBs6O?a4PSCH%sKubvm)Ji+Ux{{R<~a-r`duo$``|w@dP6}v~3x~xp>tzT*)|r z>&zWs;C;sH5YvyY5|2IH)C6e;mv@R^C0~wzCy2;kuemju_)%34-eh_8(>+0!$p=wi zPJZ++_-p{dV-Khw-ieERJYCCOPfT#)l^Pu^I&dU2|H;z5xD0EC#^nW^a!OsrvVLE{ zr&`X#%=A3wV@->Htfn~i^ON!>t`*9w#!?3 zfi?GWO=qF_u#Sm~)4e6z-qq2w3I>X*GTPWbn(lp@)XSY^x+rs^^upU=iMx(Sd zg_ZXjwxw>U^bXqbH1VZOv^A^5qCZ!1ottE3bgAp4lj*`#Y{%67^~MlS zq^Lswu<6v=ScK8UK{JYQi6Hnj+2>C-rcH9zJE64z(W|st(LE}V{yWK1=(Oa#d}vnXh*6xnq<(c)cW&W<+QQU8?Cg%LcX$C6;{a^$tMcM3ALPCGW=FsVr1 zLRDNR*@!XO(5oO^=P8^GoX@3|MMRgeJ(U%Y|m&?QWUnAGNN>b0<*;by)3 zd|I@-@4j2{!puzzFQ??ebAmNN_|TBy_Y;*x_XhnI9qz;<#1$b<-2ss2(u5iTxoeb~ zjZ#~=2;nboEZQjyg>r?o0fyb8f3}4lQ?? z(U~LFaSlhh(q0v;Mwe$?2z*+Sgti4tOp(-j&T=-WO~wohYa~e?isMy0GF@k83T@(w zDiWE@fFD^N7c2oIt!+vaXp7S8fZXF6ew8;LxrH=uHgh;Oh=2Nb42%APzmnDiN6f4@cLuZ&$z2^4bEuEs6baI@TjG0Z9&0{GnlO49v4)@HfFUrEd zD4ykxpkJRsUs$bHmE^j?aIW)iQ|0<))A_m{%R~>snbW;(xhXeaNgc3wiJhGa|2&wg z%m&~><%c;w6K^D*DmsZ8>4^x@_v|whI$>m7Qpg_y9Tz^fAmrGvsgQMKXCWYNM1XXA znWG_huPZvREboJN4_%f>uwhyKG0|XuPp`6)9vU zf^PjzD~yZ7H{T>=Y;O0%G%;p+W(;0u1F(v^FU|911AkJPWsV<@NjjwPidmIo>+Y&- z9sbg}+uRqciW^m4+}SZTKBXThUagiY=Eud(0bJK(YIQ9vrxQPBtpvwWR`knx`-xh` zO_f464vM_HWAMheFGD+y=`$a4DCP;1g0&1pg~G3bMv}zeCZ4Prt-fm|tUH~E7i{P^ zyHb280um4v|8tA^SAPus(I3M>|K1-TML_4n9(tszi(X>Pz8~TWzR~BAAfA6Z zXiZWjli#~L+%EIPS+yQt^07h0afS!gdzvtHLGgOJ=SkPv4qFXyuwt#$w%aBp*g)0z zdr1$BeuMRwLEOLg@_%CmQ)ear+RQJ%-q^StyR;LrwzbleVWJ9M9*csD1T)UkK>Kf9 zK?6a5?6H<1he+!bd8f9vy}T)x2QjxQN_x7Es*FM{QfGuYk)xGuGrbs#E9pF@0)n{; zaZJ)oZS8;;WJx)~HaZ;akV3SQjj8aeiZ|ZXmfZc?2kYNraaON?XUo8@+3#^t_fQ|ZA7})e zPT%8GjJ^9Ca`uNL-)9B?;gs_KWk~s($>cxgk%<3w9ErhT9G%a*IAStd8|%iYpB+B! kKd_FN1f1jLJ+4+4dPWe9t{H>iZ}|CT9tj33{ymZWFE_iXWdHyG literal 0 HcmV?d00001 diff --git a/itext.tests/itext.layout.tests/itext/layout/KeepTogetherDivAndTableTest.cs b/itext.tests/itext.layout.tests/itext/layout/KeepTogetherDivAndTableTest.cs new file mode 100644 index 0000000000..83bf81aecb --- /dev/null +++ b/itext.tests/itext.layout.tests/itext/layout/KeepTogetherDivAndTableTest.cs @@ -0,0 +1,131 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +using System; +using System.Text; +using iText.Kernel.Colors; +using iText.Kernel.Pdf; +using iText.Kernel.Utils; +using iText.Layout.Borders; +using iText.Layout.Element; +using iText.Layout.Logs; +using iText.Layout.Properties; +using iText.Test; +using iText.Test.Attributes; + +namespace iText.Layout { + //TODO DEVSIX-8689: Change tests after fix. + [NUnit.Framework.Category("IntegrationTest")] + public class KeepTogetherDivAndTableTest : ExtendedITextTest { + public static readonly String SOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/layout/KeepTogetherDivAndTableTest/"; + + public static readonly String DESTINATION_FOLDER = NUnit.Framework.TestContext.CurrentContext.TestDirectory + + "/test/itext/layout/KeepTogetherDivAndTableTest/"; + + [NUnit.Framework.OneTimeSetUp] + public static void BeforeClass() { + CreateDestinationFolder(DESTINATION_FOLDER); + } + + [NUnit.Framework.Test] + [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, Count = 4)] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.RENDERER_WAS_NOT_ABLE_TO_PROCESS_KEEP_WITH_NEXT)] + public virtual void CombineKeepTogetherDivWithTableTest() { + String cmpFile = SOURCE_FOLDER + "cmp_combineKeepTogetherDivWithTable.pdf"; + String destPdf = DESTINATION_FOLDER + "combineKeepTogetherDivWithTable.pdf"; + using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(destPdf))) { + Document doc = new Document(pdfDoc); + for (int i = 0; i < 10; i++) { + doc.Add(new Paragraph("").SetFontSize(10).SetMarginBottom(0).SetBorder(new SolidBorder(ColorConstants.PINK + , 1f))); + } + Div div = new Div().SetKeepTogether(true).SetKeepWithNext(true).SetBorder(new SolidBorder(ColorConstants.BLUE + , 1f)); + div.Add(new Paragraph("Moved title").SetFontSize(12).SetFontColor(ColorConstants.BLUE).SetMarginTop(10).SetMarginBottom + (0)); + doc.Add(div); + doc.Add(CreateTableWithData(CreateBigCellTest(55))); + } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(destPdf, cmpFile, DESTINATION_FOLDER, "diff" + )); + } + + [NUnit.Framework.Test] + [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA)] + public virtual void ParagraphTableSameDivKeepNextTest() { + String cmpFile = SOURCE_FOLDER + "cmp_paragraphTableSameDivKeepNext.pdf"; + String destPdf = DESTINATION_FOLDER + "paragraphTableSameDivKeepNext.pdf"; + using (PdfDocument pdf = new PdfDocument(new PdfWriter(destPdf))) { + Document document = new Document(pdf, pdf.GetDefaultPageSize(), false); + Div div = new Div().SetKeepTogether(true).SetKeepWithNext(true); + div.Add(CreateTableWithData(CreateBigCellTest(40))); + document.Add(div); + document.Close(); + } + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(destPdf, cmpFile, DESTINATION_FOLDER, "diff" + )); + } + + private String CreateBigCellTest(int numRepeats) { + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < numRepeats; ++i) { + buf.Append("Testing. "); + } + String bigText = buf.ToString(); + return bigText; + } + + private static Table CreateTableWithData(String mainCellText) { + Table table = new Table(UnitValue.CreatePercentArray(new float[] { 5, 25, 25 })); + table.SetWidth(UnitValue.CreatePercentValue(100)).SetMarginTop(0).SetMarginBottom(5); + table.SetBorder(Border.NO_BORDER); + table.SetVerticalAlignment(VerticalAlignment.BOTTOM).SetPadding(0); + table.SetFixedLayout(); + String[] headerTitles = new String[] { "Title1", "Title2", "Title3" }; + foreach (String headerTitle in headerTitles) { + table.AddHeaderCell(CreateCell(headerTitle, 8, Border.NO_BORDER)); + } + Border grayBorder = new SolidBorder(ColorConstants.LIGHT_GRAY, 0.75f); + for (int i = 0; i < 2; i++) { + table.AddCell(CreateCell(mainCellText, 10, grayBorder)); + table.AddCell(CreateCell("Col2_" + i, 10, grayBorder)); + table.AddCell(CreateCell("Col3_" + i, 10, grayBorder)); + } + return table; + } + + private static Cell CreateCell(String cellText, float fontSize, Border border) { + Paragraph p = new Paragraph(cellText); + p.SetFontSize(fontSize); + p.SetPaddingBottom(0); + p.SetKeepTogether(true); + Cell c = new Cell(); + c.SetBorder(border); + c.SetPaddingLeft(0); + c.SetPaddingBottom(0); + c.SetKeepTogether(true); + c.Add(p); + return c; + } + } +} diff --git a/itext.tests/itext.layout.tests/resources/itext/layout/KeepTogetherDivAndTableTest/cmp_combineKeepTogetherDivWithTable.pdf b/itext.tests/itext.layout.tests/resources/itext/layout/KeepTogetherDivAndTableTest/cmp_combineKeepTogetherDivWithTable.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59f9c867472e909d21ae31233d636e430108394b GIT binary patch literal 3860 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 WBvP(eItDQ^OeW)qL|Yd-+V zUaclpObhrZ!ANLh&`N7)i7P@-BK)A%n9`7z3L&Tjs|^ZiMPrNBqBAS)wndHp^8A?G zdvacL?sra{Ei>DQQp|?9uP=^`8yEnA?5r}RrV`nrN5u+}?cr3MiCr>}iF_=%)n@@~ zwfa;AbGr;Rhr`1(xyOJdenq97^Z;}yP=+k2SWoe6=4ws~)T?2APwzwN*=N%4oXS^HG`=@ZMb;<2K@$%);2pFTdb zY2Pnbhw5sNE-p1)_PXnjCtsk}IyS6}*-Y+xW{1+(Jn~le`iEa{>Mn_y7<8{&+nXLS z{QQZYF1Gp1(tDZ#^F>8z<%7dvKkeCnWk%^dcx7hv6K{OSz{a8HTxBCiJm)_D;l@rs z)6n{B`h*% zT8hZkqJLVUN8j}O>D|RWr@qA}1tTX<=%YH8WwXHI=)+u^5f7~!vw8r3dEO?TqqlNa1bCYm-<0bUUeNPP4 zKG`zX8s9u&nd*-&=%=<1qBpwYrrX{5{q?bL8v8!%T+N*+1i>xtbTIxacSN>Etv&?^ zu)4cdlYdPj3KgLv>RZ7&$ZQ6uavs?o!j=jdXJ|vEin5fcja)+J77~&)f)qj&ZDGhH zh~goPPb3Ot{+|tOip=|6SV<6zagEvoGGqkJF3@Q@Ra%}ma8Y@06 zVMQW%mxK@+^^_pZtJL~1$Wdg!7ZjEzhHBMYv9cc0IUm-0MC4*mHC9CzM`TIbmJlU3 zQ6@@hl25#Kcle#EKCgNMQ1BaUZz!%l_A7BSWWT-#i0vZpE7!M(9q4arul&<5*w2t- zje-RO1Qvr<{E7e*!%z$mz)c;?Xf4(SNH=u|G1{-(se`O#wGOg>p+njtyUW*1YTN8C z9SK+Gh34DrRD}~gSkaelUM46{6?mSuaFm57U6|!~Mqr`S#ga~zXBq9pb54Py%rwM^ z6j+{QIND{w$c$-*$t3U;&9gMkLdIk!%@m}0lfaoM z3Of-`aZa-ZB4lDHr}h7@ppwXw1R3ZvVJGaetO9+O?1V$C(-79)Jub+!QAgT%C(;I= T$|-6P2t*>r5EqwKlx_F};yYIk literal 0 HcmV?d00001 diff --git a/port-hash b/port-hash index 05ea0bee4f..fc8f8841a0 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -dd25f1a8f8aaca079e593adb93dfc1399dfac7bd \ No newline at end of file +2ac55dcea1fe0e7cc96a54d64452047dae7f9630