aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/pdf/xref/CrossReferenceTable.java
diff options
context:
space:
mode:
authorVincent Hennebert <vhennebert@apache.org>2012-03-21 15:12:43 +0000
committerVincent Hennebert <vhennebert@apache.org>2012-03-21 15:12:43 +0000
commitb9fbfa6b71b5e0d67806c066ea422819de08f3b2 (patch)
treeea0b24983c14733ec584a04b79ac108634a9cef2 /src/java/org/apache/fop/pdf/xref/CrossReferenceTable.java
parent54b6471e8fe27378222389de496721cc379a812d (diff)
downloadxmlgraphics-fop-b9fbfa6b71b5e0d67806c066ea422819de08f3b2.tar.gz
xmlgraphics-fop-b9fbfa6b71b5e0d67806c066ea422819de08f3b2.zip
Added support for PDF object streams.Temp_PDF_ObjectStreams
When accessibility is enabled and PDF version 1.5 selected, the structure tree will be stored in object streams in order to reduce the size of the final PDF. This can lead to file reductions by up to 75% git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_PDF_ObjectStreams@1303431 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/fop/pdf/xref/CrossReferenceTable.java')
-rw-r--r--src/java/org/apache/fop/pdf/xref/CrossReferenceTable.java73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/java/org/apache/fop/pdf/xref/CrossReferenceTable.java b/src/java/org/apache/fop/pdf/xref/CrossReferenceTable.java
new file mode 100644
index 000000000..41a1146ca
--- /dev/null
+++ b/src/java/org/apache/fop/pdf/xref/CrossReferenceTable.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.pdf.xref;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+import org.apache.fop.pdf.PDFDictionary;
+import org.apache.fop.pdf.PDFDocument;
+
+/**
+ * A cross-reference table, as described in Section 3.4.3 of the PDF 1.5 Reference.
+ */
+public class CrossReferenceTable extends CrossReferenceObject {
+
+ private final List<Long> objectReferences;
+
+ private final StringBuilder pdf = new StringBuilder(256);
+
+ public CrossReferenceTable(TrailerDictionary trailerDictionary, long startxref,
+ List<Long> location) {
+ super(trailerDictionary, startxref);
+ this.objectReferences = location;
+ }
+
+ public void output(OutputStream stream) throws IOException {
+ outputXref();
+ writeTrailer(stream);
+ }
+
+ private void outputXref() throws IOException {
+ pdf.append("xref\n0 ");
+ pdf.append(objectReferences.size() + 1);
+ pdf.append("\n0000000000 65535 f \n");
+ for (Long objectReference : objectReferences) {
+ final String padding = "0000000000";
+ String s = String.valueOf(objectReference);
+ if (s.length() > 10) {
+ throw new IOException("PDF file too large."
+ + " PDF 1.4 cannot grow beyond approx. 9.3GB.");
+ }
+ String loc = padding.substring(s.length()) + s;
+ pdf.append(loc).append(" 00000 n \n");
+ }
+ }
+
+ private void writeTrailer(OutputStream stream) throws IOException {
+ pdf.append("trailer\n");
+ stream.write(PDFDocument.encode(pdf.toString()));
+ PDFDictionary dictionary = trailerDictionary.getDictionary();
+ dictionary.put("/Size", objectReferences.size() + 1);
+ dictionary.output(stream);
+ }
+
+}