~amigadave/simple-scan/fix-translatable-strings

« back to all changes in this revision

Viewing changes to src/book.vala

  • Committer: Robert Ancell
  • Date: 2014-04-22 02:30:50 UTC
  • mfrom: (702.1.7 fix-pdf-trailer)
  • Revision ID: robert.ancell@canonical.com-20140422023050-7n6fpynoh016nk1y
Correct generation of PDF trailer to conform to the PDF standard.

Show diffs side-by-side

added added

removed removed

Lines of Context:
256
256
 
257
257
    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
264
        var stream = file.replace (null, false, FileCreateFlags.NONE, null);
260
265
        var writer = new PDFWriter (stream);
261
266
 
271
276
        writer.write_string ("<<\n");
272
277
        writer.write_string ("/Type /Catalog\n");
273
278
        //FIXMEwriter.write_string ("/Metadata %u 0 R\n".printf (catalog_number + 1));
 
279
        //FIXMEwriter.write_string ("/MarkInfo << /Marked true >>");
274
280
        writer.write_string ("/Pages %u 0 R\n".printf (catalog_number + 1)); //+2
275
281
        writer.write_string (">>\n");
276
282
        writer.write_string ("endobj\n");
501
507
            number = writer.start_object ();
502
508
            writer.write_string ("%u 0 obj\n".printf (number));
503
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
511
            writer.write_string (">>\n");
506
512
            writer.write_string ("stream\n");
507
513
            writer.write_string (command);
522
528
        writer.write_string ("endobj\n");
523
529
 
524
530
        /* Cross-reference table */
 
531
        writer.write_string ("\n");
525
532
        var xref_offset = writer.offset;
526
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
536
        foreach (var offset in writer.object_offsets)
529
537
            writer.write_string ("%010zu 00000 n \n".printf (offset));
530
538
 
531
539
        /* Trailer */
 
540
        writer.write_string ("\n");
532
541
        writer.write_string ("trailer\n");
533
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
544
        writer.write_string ("/Info %u 0 R\n".printf (info_number));
536
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
547
        writer.write_string (">>\n");
539
548
        writer.write_string ("startxref\n");
540
549
        writer.write_string ("%zu\n".printf (xref_offset));