simple-scan-team team mailing list archive
-
simple-scan-team team
-
Mailing list archive
-
Message #01029
[Merge] lp:~robert-ancell/simple-scan/fix-pdf-trailer into lp:simple-scan
Robert Ancell has proposed merging lp:~robert-ancell/simple-scan/fix-pdf-trailer into lp:simple-scan.
Commit message:
Correct generation of PDF trailer to conform to the PDF standard.
Requested reviews:
Simple Scan Development Team (simple-scan-team)
Related bugs:
Bug #1220826 in Simple Scan: "PDFs of scanned documents are incompatible with Adobe Reader"
https://bugs.launchpad.net/simple-scan/+bug/1220826
For more details, see:
https://code.launchpad.net/~robert-ancell/simple-scan/fix-pdf-trailer/+merge/216656
--
https://code.launchpad.net/~robert-ancell/simple-scan/fix-pdf-trailer/+merge/216656
Your team Simple Scan Development Team is requested to review the proposed merge of lp:~robert-ancell/simple-scan/fix-pdf-trailer into lp:simple-scan.
=== modified file 'src/book.vala'
--- src/book.vala 2014-04-14 23:46:26 +0000
+++ src/book.vala 2014-04-22 02:23:22 +0000
@@ -256,6 +256,11 @@
private void save_pdf (File file, int quality) throws Error
{
+ /* Generate a random ID for this file */
+ var id = "";
+ for (var i = 0; i < 4; i++)
+ id += "%08x".printf (Random.next_int ());
+
var stream = file.replace (null, false, FileCreateFlags.NONE, null);
var writer = new PDFWriter (stream);
@@ -271,6 +276,7 @@
writer.write_string ("<<\n");
writer.write_string ("/Type /Catalog\n");
//FIXMEwriter.write_string ("/Metadata %u 0 R\n".printf (catalog_number + 1));
+ //FIXMEwriter.write_string ("/MarkInfo << /Marked true >>");
writer.write_string ("/Pages %u 0 R\n".printf (catalog_number + 1)); //+2
writer.write_string (">>\n");
writer.write_string ("endobj\n");
@@ -501,7 +507,7 @@
number = writer.start_object ();
writer.write_string ("%u 0 obj\n".printf (number));
writer.write_string ("<<\n");
- writer.write_string ("/Length %d\n".printf (command.length + 1));
+ writer.write_string ("/Length %d\n".printf (command.length));
writer.write_string (">>\n");
writer.write_string ("stream\n");
writer.write_string (command);
@@ -522,19 +528,22 @@
writer.write_string ("endobj\n");
/* Cross-reference table */
+ writer.write_string ("\n");
var xref_offset = writer.offset;
writer.write_string ("xref\n");
- writer.write_string ("1 %zu\n".printf (writer.object_offsets.length ()));
+ writer.write_string ("0 %zu\n".printf (writer.object_offsets.length () + 1));
+ writer.write_string ("0000000000 65535 f \n");
foreach (var offset in writer.object_offsets)
writer.write_string ("%010zu 00000 n \n".printf (offset));
/* Trailer */
+ writer.write_string ("\n");
writer.write_string ("trailer\n");
writer.write_string ("<<\n");
- writer.write_string ("/Size %zu\n".printf (writer.object_offsets.length ()));
+ writer.write_string ("/Size %zu\n".printf (writer.object_offsets.length () + 1));
writer.write_string ("/Info %u 0 R\n".printf (info_number));
writer.write_string ("/Root %u 0 R\n".printf (catalog_number));
- //FIXME: writer.write_string ("/ID [<...> <...>]\n");
+ writer.write_string ("/ID [<%s> <%s>]\n".printf (id, id));
writer.write_string (">>\n");
writer.write_string ("startxref\n");
writer.write_string ("%zu\n".printf (xref_offset));
=== modified file 'src/simple-scan.vala'
--- src/simple-scan.vala 2013-11-01 18:02:57 +0000
+++ src/simple-scan.vala 2014-04-22 02:23:22 +0000
@@ -466,8 +466,8 @@
var line_number = 0;
var xref_offset = 0;
var xref_line = -1;
- var xref_regex = new Regex ("^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d 0000 n$", RegexCompileFlags.RAW);
- MatchInfo xref_match;
+ var startxref_line = -1;
+ var fixed_size = -1;
var line = new StringBuilder ();
while (offset < data.length)
{
@@ -483,6 +483,9 @@
}
if (line.str == "startxref\n")
+ startxref_line = line_number;
+
+ if (line.str == "xref\n")
xref_line = line_number;
/* Fix PDF header and binary comment */
@@ -492,16 +495,27 @@
fixed_file.printf ("%s", line.str.substring (1));
}
+ /* Fix xref subsection count */
+ else if (line_number == xref_line + 1 && line.str.has_prefix ("1 "))
+ {
+ fixed_size = int.parse (line.str.substring (2)) + 1;
+ fixed_file.printf ("0 %d\n", fixed_size);
+ fixed_file.printf ("0000000000 65535 f \n");
+ }
+
/* Fix xref format */
- else if (xref_regex.match (line.str, 0, out xref_match))
- fixed_file.printf ("%010d 00000 n \n", int.parse (xref_match.get_string ()) + xref_offset);
+ else if (line_number > xref_line && line.str.has_suffix (" 0000 n\n"))
+ fixed_file.printf ("%010d 00000 n \n", int.parse (line.str) + xref_offset);
/* Fix xref offset */
- else if (xref_line > 0 && line_number == xref_line + 1)
+ else if (startxref_line > 0 && line_number == startxref_line + 1)
fixed_file.printf ("%d\n".printf (int.parse (line.str) + xref_offset));
+ else if (fixed_size > 0 && line.str.has_prefix ("/Size "))
+ fixed_file.printf ("/Size %d\n".printf (fixed_size));
+
/* Fix EOF marker */
- else if (line_number == xref_line + 2 && line.str.has_prefix ("%%%%"))
+ else if (line_number == startxref_line + 2 && line.str.has_prefix ("%%%%"))
fixed_file.printf ("%s", line.str.substring (2));
else
References