Skip to content

Commit 44deca5

Browse files
Fix incorrect /Size entry of trailer for generated in append mode documents
1 parent 67b38e7 commit 44deca5

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfXrefTable.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ protected void setCapacity(int capacity) {
160160
/**
161161
* Writes cross reference table and trailer to PDF.
162162
*
163-
* @throws java.io.IOException
163+
* @throws IOException
164164
* @throws PdfException
165165
*/
166166
protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId, PdfObject crypto) throws IOException {
@@ -177,6 +177,19 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
177177
}
178178
freeReferences.clear();
179179

180+
181+
for (int i = count; i > 0; --i) {
182+
PdfIndirectReference lastRef = xref[i];
183+
if (lastRef == null
184+
|| (lastRef.isFree() && lastRef.getGenNumber() == 0)
185+
|| (!lastRef.checkState(PdfObject.FLUSHED)
186+
&& !(document.properties.appendMode && !lastRef.checkState(PdfObject.MODIFIED)))) {
187+
--count;
188+
} else {
189+
break;
190+
}
191+
}
192+
180193
List<Integer> sections = new ArrayList<>();
181194
int first = 0;
182195
int len = 1;
@@ -218,7 +231,6 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
218231
return;
219232
}
220233

221-
int size = sections.get(sections.size() - 2) + sections.get(sections.size() - 1);
222234
long startxref = writer.getCurrentPos();
223235
if (writer.isFullCompression()) {
224236
PdfStream xrefStream = new PdfStream().makeIndirect(document);
@@ -227,7 +239,7 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
227239
xrefStream.put(PdfName.ID, fileId);
228240
if (crypto != null)
229241
xrefStream.put(PdfName.Encrypt, crypto);
230-
xrefStream.put(PdfName.Size, new PdfNumber(size));
242+
xrefStream.put(PdfName.Size, new PdfNumber(this.size()));
231243
xrefStream.put(PdfName.W, new PdfArray(new ArrayList<PdfObject>() {{
232244
add(new PdfNumber(1));
233245
add(new PdfNumber(4));
@@ -295,7 +307,7 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
295307
trailer.remove(PdfName.Index);
296308
trailer.remove(PdfName.Type);
297309
trailer.remove(PdfName.Length);
298-
trailer.put(PdfName.Size, new PdfNumber(size));
310+
trailer.put(PdfName.Size, new PdfNumber(this.size()));
299311
trailer.put(PdfName.ID, fileId);
300312
if (crypto != null)
301313
trailer.put(PdfName.Encrypt, crypto);

kernel/src/test/java/com/itextpdf/kernel/pdf/TagTreePointerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public void tagTreePointerTest03() throws Exception {
204204
public void tagTreePointerTest04() throws Exception {
205205
PdfReader reader = new PdfReader(sourceFolder + "taggedDocument.pdf");
206206
PdfWriter writer = new PdfWriter(destinationFolder + "tagTreePointerTest04.pdf").setCompressionLevel(CompressionConstants.NO_COMPRESSION);
207-
PdfDocument document = new PdfDocument(reader, writer);
207+
PdfDocument document = new PdfDocument(reader, writer);
208208

209209
TagTreePointer tagPointer = new TagTreePointer(document);
210210
tagPointer.moveToKid(PdfName.Table).moveToKid(2, PdfName.TR);

kernel/src/test/java/com/itextpdf/kernel/pdf/canvas/parser/PdfCanvasProcessorTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.itextpdf.kernel.pdf.canvas.parser;
22

3+
import com.itextpdf.io.LogMessageConstant;
34
import com.itextpdf.io.source.ByteArrayOutputStream;
45
import com.itextpdf.kernel.pdf.canvas.parser.data.ClippingPathInfo;
56
import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData;
@@ -11,6 +12,8 @@
1112
import com.itextpdf.kernel.pdf.PdfPage;
1213
import com.itextpdf.kernel.pdf.PdfReader;
1314
import com.itextpdf.kernel.pdf.PdfWriter;
15+
import com.itextpdf.test.annotations.LogMessage;
16+
import com.itextpdf.test.annotations.LogMessages;
1417
import com.itextpdf.test.annotations.type.IntegrationTest;
1518
import com.itextpdf.test.ExtendedITextTest;
1619

@@ -26,6 +29,7 @@ public class PdfCanvasProcessorTest extends ExtendedITextTest {
2629
public static final String sourceFolder = "./src/test/resources/com/itextpdf/kernel/parser/PdfCanvasProcessorTest/";
2730

2831
@Test
32+
@LogMessages(messages = @LogMessage(messageTemplate = LogMessageConstant.XREF_ERROR, count = 1))
2933
public void contentStreamProcessorTest() throws IOException {
3034

3135
PdfDocument document = new PdfDocument(new PdfReader(sourceFolder + "yaxiststar.pdf"), new PdfWriter(new ByteArrayOutputStream()));

0 commit comments

Comments
 (0)