Sample code for 30+ languages & platforms
Zig Requires Chilkat v11.7.0+

Extract Text from a Two-Column PDF

See more PDF Text Extraction Examples

Demonstrates how multi-column pages are read. By default the columns are detected and each column is read top to bottom before the next ("columns": "auto"); "columns": "none" reads the full page width line by line, which interleaves the columns. The quality report tells how many columns were found.

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    // The two-column PDF used in this example is available at two_column_article.pdf

    const pdf = try chilkat.Pdf.init();
    defer pdf.deinit();
    pdf.loadFile("qa_data/pdf/two_column_article.pdf") catch {
        std.debug.print("{s}\n", .{try pdf.getLastErrorText(alloc)});
        return;
    };

    const json = try chilkat.JsonObject.init();
    defer json.deinit();
    const json_out = try chilkat.JsonObject.init();
    defer json_out.deinit();

    // With the default options the columns are detected, and the text of the left column
    // comes before the text of the right column.
    pdf.extractText("text", json, json_out) catch {
        std.debug.print("{s}\n", .{try pdf.getLastErrorText(alloc)});
        return;
    };

    std.debug.print("Columns detected: {d}\n", .{json_out.intOf("quality.pages[0].columns")});
    std.debug.print("Reading order: {s}\n", .{try json_out.stringOf(alloc, "quality.pages[0].readingOrderSource")});
    std.debug.print("{s}\n", .{try json_out.stringOf(alloc, "text")});

    // "none" switches column detection off: the page is read across its full width, line by line,
    // so each output line holds a line of the left column followed by a line of the right column.
    // This is rarely wanted, but it shows what the detection does.
    json.updateString("columns", "none") catch {};
    json.updateString("layout", "lines") catch {};
    pdf.extractText("text", json, json_out) catch {
        std.debug.print("{s}\n", .{try pdf.getLastErrorText(alloc)});
        return;
    };

    std.debug.print("---- columns: none ----\n", .{});
    std.debug.print("{s}\n", .{try json_out.stringOf(alloc, "text")});

    // Sample output (abbreviated):

    // Columns detected: 2
    // Reading order: visual
    // The Harbor Lighthouse, Season Two
    //
    // The harbor lighthouse was built in 1874 to mark the entrance to the inner channel. It operated continuously until 1968, ...
    //
    // The restoration society took ownership in 2021 with three goals: ...
    // ...
    // The lantern room frame was stripped, primed and repainted in the original dark green. ...
    // ...
    // ---- columns: none ----
    // The Harbor Lighthouse, Season Two
    // The harbor lighthouse was built in 1874 to The lantern room frame was stripped, primed
    // mark the entrance to the inner channel. It and repainted in the original dark green. New
    // ...
}