Merge lp:~robert-ancell/simple-scan/fix-pdf-trailer into lp:~simple-scan-team/simple-scan/trunk

Proposed by Robert Ancell
Status: Merged
Merged at revision: 703
Proposed branch: lp:~robert-ancell/simple-scan/fix-pdf-trailer
Merge into: lp:~simple-scan-team/simple-scan/trunk
Diff against target: 115 lines (+33/-10)
2 files modified
src/book.vala (+13/-4)
src/simple-scan.vala (+20/-6)
To merge this branch: bzr merge lp:~robert-ancell/simple-scan/fix-pdf-trailer
Reviewer Review Type Date Requested Status
Simple Scan Development Team Pending
Review via email: mp+216656@code.launchpad.net

Commit message

Correct generation of PDF trailer to conform to the PDF standard.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/book.vala'
2--- src/book.vala 2014-04-14 23:46:26 +0000
3+++ src/book.vala 2014-04-22 02:23:22 +0000
4@@ -256,6 +256,11 @@
5
6 private void save_pdf (File file, int quality) throws Error
7 {
8+ /* Generate a random ID for this file */
9+ var id = "";
10+ for (var i = 0; i < 4; i++)
11+ id += "%08x".printf (Random.next_int ());
12+
13 var stream = file.replace (null, false, FileCreateFlags.NONE, null);
14 var writer = new PDFWriter (stream);
15
16@@ -271,6 +276,7 @@
17 writer.write_string ("<<\n");
18 writer.write_string ("/Type /Catalog\n");
19 //FIXMEwriter.write_string ("/Metadata %u 0 R\n".printf (catalog_number + 1));
20+ //FIXMEwriter.write_string ("/MarkInfo << /Marked true >>");
21 writer.write_string ("/Pages %u 0 R\n".printf (catalog_number + 1)); //+2
22 writer.write_string (">>\n");
23 writer.write_string ("endobj\n");
24@@ -501,7 +507,7 @@
25 number = writer.start_object ();
26 writer.write_string ("%u 0 obj\n".printf (number));
27 writer.write_string ("<<\n");
28- writer.write_string ("/Length %d\n".printf (command.length + 1));
29+ writer.write_string ("/Length %d\n".printf (command.length));
30 writer.write_string (">>\n");
31 writer.write_string ("stream\n");
32 writer.write_string (command);
33@@ -522,19 +528,22 @@
34 writer.write_string ("endobj\n");
35
36 /* Cross-reference table */
37+ writer.write_string ("\n");
38 var xref_offset = writer.offset;
39 writer.write_string ("xref\n");
40- writer.write_string ("1 %zu\n".printf (writer.object_offsets.length ()));
41+ writer.write_string ("0 %zu\n".printf (writer.object_offsets.length () + 1));
42+ writer.write_string ("0000000000 65535 f \n");
43 foreach (var offset in writer.object_offsets)
44 writer.write_string ("%010zu 00000 n \n".printf (offset));
45
46 /* Trailer */
47+ writer.write_string ("\n");
48 writer.write_string ("trailer\n");
49 writer.write_string ("<<\n");
50- writer.write_string ("/Size %zu\n".printf (writer.object_offsets.length ()));
51+ writer.write_string ("/Size %zu\n".printf (writer.object_offsets.length () + 1));
52 writer.write_string ("/Info %u 0 R\n".printf (info_number));
53 writer.write_string ("/Root %u 0 R\n".printf (catalog_number));
54- //FIXME: writer.write_string ("/ID [<...> <...>]\n");
55+ writer.write_string ("/ID [<%s> <%s>]\n".printf (id, id));
56 writer.write_string (">>\n");
57 writer.write_string ("startxref\n");
58 writer.write_string ("%zu\n".printf (xref_offset));
59
60=== modified file 'src/simple-scan.vala'
61--- src/simple-scan.vala 2013-11-01 18:02:57 +0000
62+++ src/simple-scan.vala 2014-04-22 02:23:22 +0000
63@@ -466,8 +466,8 @@
64 var line_number = 0;
65 var xref_offset = 0;
66 var xref_line = -1;
67- var xref_regex = new Regex ("^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d 0000 n$", RegexCompileFlags.RAW);
68- MatchInfo xref_match;
69+ var startxref_line = -1;
70+ var fixed_size = -1;
71 var line = new StringBuilder ();
72 while (offset < data.length)
73 {
74@@ -483,6 +483,9 @@
75 }
76
77 if (line.str == "startxref\n")
78+ startxref_line = line_number;
79+
80+ if (line.str == "xref\n")
81 xref_line = line_number;
82
83 /* Fix PDF header and binary comment */
84@@ -492,16 +495,27 @@
85 fixed_file.printf ("%s", line.str.substring (1));
86 }
87
88+ /* Fix xref subsection count */
89+ else if (line_number == xref_line + 1 && line.str.has_prefix ("1 "))
90+ {
91+ fixed_size = int.parse (line.str.substring (2)) + 1;
92+ fixed_file.printf ("0 %d\n", fixed_size);
93+ fixed_file.printf ("0000000000 65535 f \n");
94+ }
95+
96 /* Fix xref format */
97- else if (xref_regex.match (line.str, 0, out xref_match))
98- fixed_file.printf ("%010d 00000 n \n", int.parse (xref_match.get_string ()) + xref_offset);
99+ else if (line_number > xref_line && line.str.has_suffix (" 0000 n\n"))
100+ fixed_file.printf ("%010d 00000 n \n", int.parse (line.str) + xref_offset);
101
102 /* Fix xref offset */
103- else if (xref_line > 0 && line_number == xref_line + 1)
104+ else if (startxref_line > 0 && line_number == startxref_line + 1)
105 fixed_file.printf ("%d\n".printf (int.parse (line.str) + xref_offset));
106
107+ else if (fixed_size > 0 && line.str.has_prefix ("/Size "))
108+ fixed_file.printf ("/Size %d\n".printf (fixed_size));
109+
110 /* Fix EOF marker */
111- else if (line_number == xref_line + 2 && line.str.has_prefix ("%%%%"))
112+ else if (line_number == startxref_line + 2 && line.str.has_prefix ("%%%%"))
113 fixed_file.printf ("%s", line.str.substring (2));
114
115 else

Subscribers

People subscribed via source and target branches