class Origami::PDF::LinearParser

Create a new PDF linear Parser.

Public Instance Methods

parse(stream) click to toggle source
Calls superclass method
# File lib/origami/parsers/pdf/linear.rb, line 32
def parse(stream)
    super

    pdf = parse_initialize

    #
    # Parse each revision
    #
    revision = 0
    until @data.eos? do
        begin
            pdf.add_new_revision unless revision.zero?
            revision = revision + 1

            info "...Parsing revision #{pdf.revisions.size}..."
            loop do
                break if (object = parse_object).nil?
                pdf.insert(object)
            end

            pdf.revisions.last.xreftable = parse_xreftable

            trailer = parse_trailer
            pdf.revisions.last.trailer = trailer

            locate_xref_stream(pdf, pdf.revisions.last)

        rescue
            error "Cannot read : " + (@data.peek(10) + "...").inspect
            error "Stopped on exception : " + $!.message

            break
        end
    end

    pdf.loaded!

    parse_finalize(pdf)
end

Private Instance Methods

locate_xref_stream(pdf, revision) click to toggle source
# File lib/origami/parsers/pdf/linear.rb, line 74
def locate_xref_stream(pdf, revision)
    trailer = revision.trailer

    # Try to match the location of the last startxref / XRefStm with an XRefStream.
    if trailer.startxref != 0
        xrefstm = pdf.get_object_by_offset(trailer.startxref)
    else
        xrefstm = pdf.get_object_by_offset(trailer[:XRefStm])
    end

    if xrefstm.is_a?(XRefStream)
        warn "Found a XRefStream for this revision at #{xrefstm.reference}"
        revision.xrefstm = xrefstm
    end
end