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
=== 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 @@
256256
257 private void save_pdf (File file, int quality) throws Error257 private void save_pdf (File file, int quality) throws Error
258 {258 {
259 /* Generate a random ID for this file */
260 var id = "";
261 for (var i = 0; i < 4; i++)
262 id += "%08x".printf (Random.next_int ());
263
259 var stream = file.replace (null, false, FileCreateFlags.NONE, null);264 var stream = file.replace (null, false, FileCreateFlags.NONE, null);
260 var writer = new PDFWriter (stream);265 var writer = new PDFWriter (stream);
261266
@@ -271,6 +276,7 @@
271 writer.write_string ("<<\n");276 writer.write_string ("<<\n");
272 writer.write_string ("/Type /Catalog\n");277 writer.write_string ("/Type /Catalog\n");
273 //FIXMEwriter.write_string ("/Metadata %u 0 R\n".printf (catalog_number + 1));278 //FIXMEwriter.write_string ("/Metadata %u 0 R\n".printf (catalog_number + 1));
279 //FIXMEwriter.write_string ("/MarkInfo << /Marked true >>");
274 writer.write_string ("/Pages %u 0 R\n".printf (catalog_number + 1)); //+2280 writer.write_string ("/Pages %u 0 R\n".printf (catalog_number + 1)); //+2
275 writer.write_string (">>\n");281 writer.write_string (">>\n");
276 writer.write_string ("endobj\n");282 writer.write_string ("endobj\n");
@@ -501,7 +507,7 @@
501 number = writer.start_object ();507 number = writer.start_object ();
502 writer.write_string ("%u 0 obj\n".printf (number));508 writer.write_string ("%u 0 obj\n".printf (number));
503 writer.write_string ("<<\n");509 writer.write_string ("<<\n");
504 writer.write_string ("/Length %d\n".printf (command.length + 1));510 writer.write_string ("/Length %d\n".printf (command.length));
505 writer.write_string (">>\n");511 writer.write_string (">>\n");
506 writer.write_string ("stream\n");512 writer.write_string ("stream\n");
507 writer.write_string (command);513 writer.write_string (command);
@@ -522,19 +528,22 @@
522 writer.write_string ("endobj\n");528 writer.write_string ("endobj\n");
523529
524 /* Cross-reference table */530 /* Cross-reference table */
531 writer.write_string ("\n");
525 var xref_offset = writer.offset;532 var xref_offset = writer.offset;
526 writer.write_string ("xref\n");533 writer.write_string ("xref\n");
527 writer.write_string ("1 %zu\n".printf (writer.object_offsets.length ()));534 writer.write_string ("0 %zu\n".printf (writer.object_offsets.length () + 1));
535 writer.write_string ("0000000000 65535 f \n");
528 foreach (var offset in writer.object_offsets)536 foreach (var offset in writer.object_offsets)
529 writer.write_string ("%010zu 00000 n \n".printf (offset));537 writer.write_string ("%010zu 00000 n \n".printf (offset));
530538
531 /* Trailer */539 /* Trailer */
540 writer.write_string ("\n");
532 writer.write_string ("trailer\n");541 writer.write_string ("trailer\n");
533 writer.write_string ("<<\n");542 writer.write_string ("<<\n");
534 writer.write_string ("/Size %zu\n".printf (writer.object_offsets.length ()));543 writer.write_string ("/Size %zu\n".printf (writer.object_offsets.length () + 1));
535 writer.write_string ("/Info %u 0 R\n".printf (info_number));544 writer.write_string ("/Info %u 0 R\n".printf (info_number));
536 writer.write_string ("/Root %u 0 R\n".printf (catalog_number));545 writer.write_string ("/Root %u 0 R\n".printf (catalog_number));
537 //FIXME: writer.write_string ("/ID [<...> <...>]\n");546 writer.write_string ("/ID [<%s> <%s>]\n".printf (id, id));
538 writer.write_string (">>\n");547 writer.write_string (">>\n");
539 writer.write_string ("startxref\n");548 writer.write_string ("startxref\n");
540 writer.write_string ("%zu\n".printf (xref_offset));549 writer.write_string ("%zu\n".printf (xref_offset));
541550
=== 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 @@
466 var line_number = 0;466 var line_number = 0;
467 var xref_offset = 0;467 var xref_offset = 0;
468 var xref_line = -1;468 var xref_line = -1;
469 var xref_regex = new Regex ("^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d 0000 n$", RegexCompileFlags.RAW);469 var startxref_line = -1;
470 MatchInfo xref_match;470 var fixed_size = -1;
471 var line = new StringBuilder ();471 var line = new StringBuilder ();
472 while (offset < data.length)472 while (offset < data.length)
473 {473 {
@@ -483,6 +483,9 @@
483 }483 }
484484
485 if (line.str == "startxref\n")485 if (line.str == "startxref\n")
486 startxref_line = line_number;
487
488 if (line.str == "xref\n")
486 xref_line = line_number;489 xref_line = line_number;
487490
488 /* Fix PDF header and binary comment */491 /* Fix PDF header and binary comment */
@@ -492,16 +495,27 @@
492 fixed_file.printf ("%s", line.str.substring (1));495 fixed_file.printf ("%s", line.str.substring (1));
493 }496 }
494497
498 /* Fix xref subsection count */
499 else if (line_number == xref_line + 1 && line.str.has_prefix ("1 "))
500 {
501 fixed_size = int.parse (line.str.substring (2)) + 1;
502 fixed_file.printf ("0 %d\n", fixed_size);
503 fixed_file.printf ("0000000000 65535 f \n");
504 }
505
495 /* Fix xref format */506 /* Fix xref format */
496 else if (xref_regex.match (line.str, 0, out xref_match))507 else if (line_number > xref_line && line.str.has_suffix (" 0000 n\n"))
497 fixed_file.printf ("%010d 00000 n \n", int.parse (xref_match.get_string ()) + xref_offset);508 fixed_file.printf ("%010d 00000 n \n", int.parse (line.str) + xref_offset);
498509
499 /* Fix xref offset */510 /* Fix xref offset */
500 else if (xref_line > 0 && line_number == xref_line + 1)511 else if (startxref_line > 0 && line_number == startxref_line + 1)
501 fixed_file.printf ("%d\n".printf (int.parse (line.str) + xref_offset));512 fixed_file.printf ("%d\n".printf (int.parse (line.str) + xref_offset));
502513
514 else if (fixed_size > 0 && line.str.has_prefix ("/Size "))
515 fixed_file.printf ("/Size %d\n".printf (fixed_size));
516
503 /* Fix EOF marker */517 /* Fix EOF marker */
504 else if (line_number == xref_line + 2 && line.str.has_prefix ("%%%%"))518 else if (line_number == startxref_line + 2 && line.str.has_prefix ("%%%%"))
505 fixed_file.printf ("%s", line.str.substring (2));519 fixed_file.printf ("%s", line.str.substring (2));
506520
507 else521 else

Subscribers

People subscribed via source and target branches