Skip to content

Commit cf6ae32

Browse files
Benoit Lagaeitext-teamcity
authored andcommitted
Fix xref 0 entry index retrieval when reading file
DEVSIX-1428 Autoported commit. Original commit hash: [ff82dd031]
1 parent fd3a4c1 commit cf6ae32

File tree

4 files changed

+109
-3
lines changed

4 files changed

+109
-3
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
using System;
7+
using iText.Test;
8+
9+
namespace iText.Kernel.Pdf {
10+
/// <author>benoit</author>
11+
public class PdfXrefTableTest : ExtendedITextTest {
12+
public static readonly String sourceFolder = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext
13+
.CurrentContext.TestDirectory) + "/resources/itext/kernel/pdf/PdfXrefTableTest/";
14+
15+
public static readonly String destinationFolder = NUnit.Framework.TestContext.CurrentContext.TestDirectory
16+
+ "/test/itext/kernel/pdf/PdfXrefTableTest/";
17+
18+
[NUnit.Framework.OneTimeSetUp]
19+
public static void BeforeClass() {
20+
ITextTest.CreateOrClearDestinationFolder(destinationFolder);
21+
}
22+
23+
/// <exception cref="System.IO.IOException"/>
24+
[NUnit.Framework.Test]
25+
public virtual void TestCreateAndUpdateXMP() {
26+
String created = destinationFolder + "testCreateAndUpdateXMP_create.pdf";
27+
String updated = destinationFolder + "testCreateAndUpdateXMP_update.pdf";
28+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(created));
29+
pdfDocument.AddNewPage();
30+
pdfDocument.GetXmpMetadata(true);
31+
// create XMP metadata
32+
pdfDocument.Close();
33+
pdfDocument = new PdfDocument(new PdfReader(created), new PdfWriter(updated));
34+
pdfDocument.Close();
35+
pdfDocument = new PdfDocument(new PdfReader(updated));
36+
PdfXrefTable xref = pdfDocument.GetXref();
37+
PdfIndirectReference freeRef = xref.Get(xref.Size() - 2);
38+
// 6
39+
/*
40+
Current xref structure:
41+
xref
42+
0 8
43+
0000000006 65535 f % this is object 0; 6 refers to free object 6
44+
0000000203 00000 n
45+
0000000510 00000 n
46+
0000000263 00000 n
47+
0000000088 00000 n
48+
0000000015 00000 n
49+
0000000000 00001 f % this is object 6; 0 refers to free object 0; note generation number
50+
0000000561 00000 n
51+
*/
52+
NUnit.Framework.Assert.IsTrue(freeRef.IsFree());
53+
NUnit.Framework.Assert.AreEqual(xref.Get(0).offsetOrIndex, freeRef.objNr);
54+
NUnit.Framework.Assert.AreEqual(1, freeRef.genNr);
55+
pdfDocument.Close();
56+
}
57+
58+
/// <exception cref="System.IO.IOException"/>
59+
[NUnit.Framework.Test]
60+
public virtual void TestCreateAndUpdateTwiceXMP() {
61+
String created = destinationFolder + "testCreateAndUpdateTwiceXMP_create.pdf";
62+
String updated = destinationFolder + "testCreateAndUpdateTwiceXMP_update.pdf";
63+
String updatedAgain = destinationFolder + "testCreateAndUpdateTwiceXMP_updatedAgain.pdf";
64+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(created));
65+
pdfDocument.AddNewPage();
66+
pdfDocument.GetXmpMetadata(true);
67+
// create XMP metadata
68+
pdfDocument.Close();
69+
pdfDocument = new PdfDocument(new PdfReader(created), new PdfWriter(updated));
70+
pdfDocument.Close();
71+
pdfDocument = new PdfDocument(new PdfReader(updated), new PdfWriter(updatedAgain));
72+
pdfDocument.Close();
73+
pdfDocument = new PdfDocument(new PdfReader(updatedAgain));
74+
PdfXrefTable xref = pdfDocument.GetXref();
75+
PdfIndirectReference freeRef1 = xref.Get(xref.Size() - 3);
76+
// 6
77+
PdfIndirectReference freeRef2 = xref.Get(xref.Size() - 2);
78+
// 7
79+
/*
80+
Current xref structure:
81+
xref
82+
0 9
83+
0000000006 65535 f % this is object 0; 6 refers to free object 6
84+
0000000203 00000 n
85+
0000000510 00000 n
86+
0000000263 00000 n
87+
0000000088 00000 n
88+
0000000015 00000 n
89+
0000000007 00002 f % this is object 6; 7 refers to free object 7; note generation number
90+
0000000000 00001 f % this is object 7; 0 refers to free object 0; note generation number
91+
0000000561 00000 n
92+
*/
93+
NUnit.Framework.Assert.IsTrue(freeRef1.IsFree());
94+
NUnit.Framework.Assert.AreEqual(xref.Get(0).offsetOrIndex, freeRef1.objNr);
95+
NUnit.Framework.Assert.AreEqual(2, freeRef1.genNr);
96+
NUnit.Framework.Assert.IsTrue(freeRef2.IsFree());
97+
NUnit.Framework.Assert.AreEqual(freeRef1.offsetOrIndex, freeRef2.objNr);
98+
NUnit.Framework.Assert.AreEqual(1, freeRef2.genNr);
99+
pdfDocument.Close();
100+
}
101+
}
102+
}

itext/itext.kernel/itext/kernel/pdf/PdfReader.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -917,7 +917,12 @@ protected internal virtual PdfDictionary ReadXrefSection() {
917917
reference.ClearState(PdfObject.READING);
918918
}
919919
else {
920-
continue;
920+
if (reference.objNr == 0 && pos != 0L) {
921+
reference.SetIndex(pos);
922+
}
923+
else {
924+
continue;
925+
}
921926
}
922927
}
923928
if (tokens.TokenValueEqualsTo(PdfTokenizer.N)) {

itext/itext.kernel/itext/kernel/pdf/PdfXrefTable.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ internal virtual PdfIndirectReference CreateNewIndirectReference(PdfDocument doc
116116
}
117117

118118
protected internal virtual void FreeReference(PdfIndirectReference reference) {
119-
reference.SetOffset(0);
120119
reference.SetState(PdfObject.FREE);
121120
if (!reference.CheckState(PdfObject.FLUSHED)) {
122121
if (reference.refersTo != null) {

port-hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
e029f7c146b1cdabda9d177dac98a423d5d770cb
1+
ff82dd0311e7e051ca7a79f28d309553ccaba7ea

0 commit comments

Comments
 (0)