Skip to content

Commit b62be3a

Browse files
yulian-gaponenkoitext-teamcity
authored andcommitted
Implement tests for special cases of free references handling
Autoported commit. Original commit hash: [a9e869592]
1 parent 2910b74 commit b62be3a

File tree

5 files changed

+141
-1
lines changed

5 files changed

+141
-1
lines changed

itext.tests/itext.kernel.tests/itext/kernel/pdf/FreeReferencesTest.cs

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
24
using iText.Test;
35

46
namespace 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 = "\nxref";
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
}
Binary file not shown.

port-hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2d9b063944b0f10315f8c60a7a6b599e5187f500
1+
a9e869592c56bb12a0afe24aff383a3f590da3fb

0 commit comments

Comments
 (0)