~ubuntu-branches/ubuntu/saucy/fop/saucy-proposed

« back to all changes in this revision

Viewing changes to src/java/org/apache/fop/pdf/xref/CrossReferenceTable.java

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-05-21 12:21:26 UTC
  • mfrom: (15.1.7 sid)
  • Revision ID: package-import@ubuntu.com-20130521122126-3c9r5fo6ountjg6r
Tags: 1:1.1.dfsg-2ubuntu1
* Merge from Debian unstable.  Remaining changes:
  -  Transition libservlet2.5-java -> libservlet3.0-java.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Licensed to the Apache Software Foundation (ASF) under one or more
 
3
 * contributor license agreements.  See the NOTICE file distributed with
 
4
 * this work for additional information regarding copyright ownership.
 
5
 * The ASF licenses this file to You under the Apache License, Version 2.0
 
6
 * (the "License"); you may not use this file except in compliance with
 
7
 * the License.  You may obtain a copy of the License at
 
8
 *
 
9
 *      http://www.apache.org/licenses/LICENSE-2.0
 
10
 *
 
11
 * Unless required by applicable law or agreed to in writing, software
 
12
 * distributed under the License is distributed on an "AS IS" BASIS,
 
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
14
 * See the License for the specific language governing permissions and
 
15
 * limitations under the License.
 
16
 */
 
17
 
 
18
/* $Id: CrossReferenceTable.java 1305467 2012-03-26 17:39:20Z vhennebert $ */
 
19
 
 
20
package org.apache.fop.pdf.xref;
 
21
 
 
22
import java.io.IOException;
 
23
import java.io.OutputStream;
 
24
import java.util.List;
 
25
 
 
26
import org.apache.fop.pdf.PDFDictionary;
 
27
import org.apache.fop.pdf.PDFDocument;
 
28
 
 
29
/**
 
30
 * A cross-reference table, as described in Section 3.4.3 of the PDF 1.5 Reference.
 
31
 */
 
32
public class CrossReferenceTable extends CrossReferenceObject {
 
33
 
 
34
    private final List<Long> objectReferences;
 
35
 
 
36
    private final StringBuilder pdf = new StringBuilder(256);
 
37
 
 
38
    public CrossReferenceTable(TrailerDictionary trailerDictionary, long startxref,
 
39
            List<Long> location) {
 
40
        super(trailerDictionary, startxref);
 
41
        this.objectReferences = location;
 
42
    }
 
43
 
 
44
    public void output(OutputStream stream) throws IOException {
 
45
        outputXref();
 
46
        writeTrailer(stream);
 
47
    }
 
48
 
 
49
    private void outputXref() throws IOException {
 
50
        pdf.append("xref\n0 ");
 
51
        pdf.append(objectReferences.size() + 1);
 
52
        pdf.append("\n0000000000 65535 f \n");
 
53
        for (Long objectReference : objectReferences) {
 
54
            final String padding = "0000000000";
 
55
            String s = String.valueOf(objectReference);
 
56
            if (s.length() > 10) {
 
57
                throw new IOException("PDF file too large."
 
58
                        + " PDF 1.4 cannot grow beyond approx. 9.3GB.");
 
59
            }
 
60
            String loc = padding.substring(s.length()) + s;
 
61
            pdf.append(loc).append(" 00000 n \n");
 
62
        }
 
63
    }
 
64
 
 
65
    private void writeTrailer(OutputStream stream) throws IOException {
 
66
        pdf.append("trailer\n");
 
67
        stream.write(PDFDocument.encode(pdf.toString()));
 
68
        PDFDictionary dictionary = trailerDictionary.getDictionary();
 
69
        dictionary.put("/Size", objectReferences.size() + 1);
 
70
        dictionary.output(stream);
 
71
    }
 
72
 
 
73
}