11using System ;
2+ using System . Collections . Generic ;
3+ using System . Text ;
24using iText . Test ;
35
46namespace iText . Kernel . Pdf {
@@ -13,5 +15,143 @@ public class FreeReferencesTest : ExtendedITextTest {
1315 public static void BeforeClass ( ) {
1416 CreateOrClearDestinationFolder ( destinationFolder ) ;
1517 }
18+
19+ /// <exception cref="System.IO.IOException"/>
20+ [ NUnit . Framework . Test ]
21+ public virtual void FreeReferencesTest01 ( ) {
22+ String src = "freeRefsGapsAndMaxGen.pdf" ;
23+ String @out = "freeReferencesTest01.pdf" ;
24+ PdfDocument pdfDocument = new PdfDocument ( new PdfReader ( sourceFolder + src ) , new PdfWriter ( destinationFolder
25+ + @out ) ) ;
26+ pdfDocument . Close ( ) ;
27+ String [ ] xrefString = ExtractXrefTableAsStrings ( @out ) ;
28+ String [ ] expected = new String [ ] { "xref\n " + "0 4\n " + "0000000000 65535 f \n " + "0000000269 00000 n \n "
29+ + "0000000561 00000 n \n " + "0000000314 00000 n \n " + "12 3\n " + "0000000133 00000 n \n " + "0000000015 00000 n \n "
30+ + "0000000613 00000 n \n " } ;
31+ // TODO first xref shall have no subsections
32+ NUnit . Framework . Assert . AreEqual ( expected , xrefString ) ;
33+ }
34+
35+ /// <exception cref="System.IO.IOException"/>
36+ [ NUnit . Framework . Test ]
37+ public virtual void FreeReferencesTest02 ( ) {
38+ String src = "freeRefsGapsAndMaxGen.pdf" ;
39+ String @out = "freeReferencesTest02.pdf" ;
40+ PdfDocument pdfDocument = new PdfDocument ( new PdfReader ( sourceFolder + src ) , new PdfWriter ( destinationFolder
41+ + @out ) , new StampingProperties ( ) . UseAppendMode ( ) ) ;
42+ pdfDocument . Close ( ) ;
43+ String [ ] xrefString = ExtractXrefTableAsStrings ( @out ) ;
44+ String [ ] expected = new String [ ] { "xref\n " + "0 5\n " + "0000000010 65535 f \n " + "0000000269 00000 n \n "
45+ + "0000000569 00000 n \n " + "0000000314 00000 n \n " + "0000000000 65535 f \n " + "10 5\n " + "0000000011 00000 f \n "
46+ + "0000000000 00001 f \n " + "0000000133 00000 n \n " + "0000000015 00000 n \n " + "0000000480 00000 n \n "
47+ , "xref\n " + "3 1\n " + "0000000995 00000 n \n " } ;
48+ // Append mode, no possibility to fix subsections in first xref
49+ NUnit . Framework . Assert . AreEqual ( expected , xrefString ) ;
50+ }
51+
52+ /// <exception cref="System.IO.IOException"/>
53+ [ NUnit . Framework . Test ]
54+ public virtual void FreeReferencesTest03 ( ) {
55+ String src = "freeRefsDeletedObj.pdf" ;
56+ String @out = "freeReferencesTest03.pdf" ;
57+ PdfDocument pdfDocument = new PdfDocument ( new PdfReader ( sourceFolder + src ) , new PdfWriter ( destinationFolder
58+ + @out ) , new StampingProperties ( ) . UseAppendMode ( ) ) ;
59+ pdfDocument . AddNewPage ( ) ;
60+ pdfDocument . Close ( ) ;
61+ String [ ] xrefString = ExtractXrefTableAsStrings ( @out ) ;
62+ String [ ] expected = new String [ ] { "xref\n " + "0 7\n " + "0000000000 65535 f \n " + "0000000265 00000 n \n "
63+ + "0000000564 00000 n \n " + "0000000310 00000 n \n " + "0000000132 00000 n \n " + "0000000015 00001 n \n "
64+ + "0000000476 00000 n \n " , "xref\n " + "0 1\n " + "0000000005 65535 n \n " + "3 3\n " + "0000000923 00000 n \n "
65+ + "0000001170 00000 n \n " + "0000000000 00002 f \n " + "7 1\n " + "0000001303 00000 n \n " , "xref\n " + "1 3\n "
66+ + "0000001706 00000 n \n " + "0000001998 00000 n \n " + "0000001751 00000 n \n " + "5 1\n " + "0000002055 00002 n \n "
67+ + "8 1\n " + "0000002156 00000 n \n " } ;
68+ // TODO fifth object is no longer free, however zero obj not updated
69+ NUnit . Framework . Assert . AreEqual ( expected , xrefString ) ;
70+ }
71+
72+ /// <exception cref="System.IO.IOException"/>
73+ [ NUnit . Framework . Test ]
74+ public virtual void FreeReferencesTest04 ( ) {
75+ String src = "simpleDoc.pdf" ;
76+ String @out = "freeReferencesTest04.pdf" ;
77+ PdfDocument pdfDocument = new PdfDocument ( new PdfReader ( sourceFolder + src ) , new PdfWriter ( destinationFolder
78+ + @out ) ) ;
79+ PdfObject contentsObj = pdfDocument . GetPage ( 1 ) . GetPdfObject ( ) . Remove ( PdfName . Contents ) ;
80+ NUnit . Framework . Assert . IsTrue ( contentsObj is PdfIndirectReference ) ;
81+ PdfIndirectReference contentsRef = ( PdfIndirectReference ) contentsObj ;
82+ contentsRef . SetFree ( ) ;
83+ PdfObject freedContentsRefRefersTo = contentsRef . GetRefersTo ( ) ;
84+ NUnit . Framework . Assert . IsNull ( freedContentsRefRefersTo ) ;
85+ pdfDocument . Close ( ) ;
86+ }
87+
88+ /// <exception cref="System.IO.IOException"/>
89+ [ NUnit . Framework . Test ]
90+ public virtual void FreeReferencesTest05 ( ) {
91+ String src = "simpleDocWithSubsections.pdf" ;
92+ String @out = "freeReferencesTest05.pdf" ;
93+ PdfDocument pdfDocument = new PdfDocument ( new PdfReader ( sourceFolder + src ) , new PdfWriter ( destinationFolder
94+ + @out ) ) ;
95+ pdfDocument . Close ( ) ;
96+ String [ ] xrefString = ExtractXrefTableAsStrings ( @out ) ;
97+ String [ ] expected = new String [ ] { "xref\n " + "0 4\n " + "0000000000 65535 f \n " + "0000000269 00000 n \n "
98+ + "0000000561 00000 n \n " + "0000000314 00000 n \n " + "11 3\n " + "0000000133 00000 n \n " + "0000000015 00000 n \n "
99+ + "0000000613 00000 n \n " } ;
100+ // TODO first xref shall have no subsections
101+ NUnit . Framework . Assert . AreEqual ( expected , xrefString ) ;
102+ }
103+
104+ /// <exception cref="System.IO.IOException"/>
105+ [ NUnit . Framework . Test ]
106+ public virtual void FreeReferencesTest06 ( ) {
107+ String src = "simpleDocWithSubsections.pdf" ;
108+ String @out = "freeReferencesTest06.pdf" ;
109+ PdfDocument pdfDocument = new PdfDocument ( new PdfReader ( sourceFolder + src ) , new PdfWriter ( destinationFolder
110+ + @out ) , new StampingProperties ( ) . UseAppendMode ( ) ) ;
111+ pdfDocument . Close ( ) ;
112+ String [ ] xrefString = ExtractXrefTableAsStrings ( @out ) ;
113+ String [ ] expected = new String [ ] { "xref\n " + "0 4\n " + "0000000000 65535 f \n " + "0000000269 00000 n \n "
114+ + "0000000569 00000 n \n " + "0000000314 00000 n \n " + "11 3\n " + "0000000133 00000 n \n " + "0000000015 00000 n \n "
115+ + "0000000480 00000 n \n " , "xref\n " + "3 1\n " + "0000000935 00000 n \n " } ;
116+ // Append mode, no possibility to fix subsections in first xref
117+ NUnit . Framework . Assert . AreEqual ( expected , xrefString ) ;
118+ }
119+
120+ /// <exception cref="System.IO.IOException"/>
121+ [ NUnit . Framework . Test ]
122+ public virtual void FreeReferencesTest07 ( ) {
123+ String @out = "freeReferencesTest07.pdf" ;
124+ PdfDocument pdfDocument = new PdfDocument ( new PdfWriter ( destinationFolder + @out ) ) ;
125+ pdfDocument . CreateNextIndirectReference ( ) ;
126+ pdfDocument . AddNewPage ( ) ;
127+ pdfDocument . Close ( ) ;
128+ String [ ] xrefString = ExtractXrefTableAsStrings ( @out ) ;
129+ String [ ] expected = new String [ ] { "xref\n " + "0 4\n " + "0000000000 65535 f \n " + "0000000203 00000 n \n "
130+ + "0000000414 00000 n \n " + "0000000248 00000 n \n " + "5 2\n " + "0000000088 00000 n \n " + "0000000015 00000 n \n "
131+ } ;
132+ // TODO first xref shall have no subsections
133+ NUnit . Framework . Assert . AreEqual ( expected , xrefString ) ;
134+ }
135+
136+ /// <exception cref="System.IO.IOException"/>
137+ private String [ ] ExtractXrefTableAsStrings ( String @out ) {
138+ byte [ ] outPdfBytes = ReadFile ( destinationFolder + @out ) ;
139+ String outPdfContent = iText . IO . Util . JavaUtil . GetStringForBytes ( outPdfBytes , Encoding . ASCII ) ;
140+ String xrefStr = "\n xref" ;
141+ String trailerStr = "trailer" ;
142+ int xrefInd = outPdfContent . IndexOf ( xrefStr , StringComparison . Ordinal ) ;
143+ int trailerInd = outPdfContent . IndexOf ( trailerStr , StringComparison . Ordinal ) ;
144+ int lastXrefInd = outPdfContent . LastIndexOf ( xrefStr ) ;
145+ IList < String > xrefs = new List < String > ( ) ;
146+ while ( true ) {
147+ xrefs . Add ( outPdfContent . JSubstring ( xrefInd + 1 , trailerInd ) ) ;
148+ if ( xrefInd == lastXrefInd ) {
149+ break ;
150+ }
151+ xrefInd = outPdfContent . IndexOf ( xrefStr , xrefInd + 1 ) ;
152+ trailerInd = outPdfContent . IndexOf ( trailerStr , trailerInd + 1 ) ;
153+ }
154+ return xrefs . ToArray ( new String [ xrefs . Count ] ) ;
155+ }
16156 }
17157}
0 commit comments