PDF Annotator of Nightmares 🎃

PDFrankenstein is a GUI tool that intends to fill the gap on Linux where a good capable PDF annotator like Adobe Acrobat does not exist.

What can you do with it?

  • Put your signature on documents.
  • Fill forms.
  • Add clickable links.
  • Draw on documents and highlight areas.
  • Multiple page PDFs are supported.
  • Anything you can do in Inkscape.

sceenshot

Requirements

Install

Packages are available for:

Download

Download the latest version from the releases page. Alternatively, you can checkout and build the code:

git clone https://github.com/oxplot/pdfrankenstein.git
cd pdfrankenstein
go build
./pdfrankenstein

How does it work?

When you select a page to annotate, it's converted to SVG, made into a locked background of another SVG which is opened in Inkscape for you to draw on. After annotating all the pages needed, saving the file will go through all the annotated pages, and for each removes the added background, exports the page to PDF and finally overlays each annotation on the corresponding page of the orignal PDF and outputs the final file.

Inkscape is used much like vim or emacs are used as your editor in the shell when you run crontab -e. Instead of crontab implementing its own editor, it creates a temporary file, runs vim and checks if the file is updated after vim is closed.

Comments
  • Crash after inkspace is closed

    Crash after inkspace is closed

    Hi, After saving the file and closing inkspace, i'm getting the crash log :

    Jun 08 01:09:08 hspecter xsession[295672]: [xcb] Unknown sequence number while awaiting reply
    Jun 08 01:09:08 hspecter xsession[295672]: [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
    Jun 08 01:09:08 hspecter xsession[295672]: [xcb] Aborting, sorry about that.
    Jun 08 01:09:08 hspecter xsession[295672]: pdfrankenstein: xcb_io.c:365: poll_for_response: Assertion `!xcb_xlib_threads_sequence_lost' failed.
    Jun 08 01:09:08 hspecter xsession[295672]: SIGABRT: abort
    Jun 08 01:09:08 hspecter xsession[295672]: PC=0x7f73b3689c1f m=0 sigcode=18446744073709551610
    Jun 08 01:09:08 hspecter xsession[295672]: signal arrived during cgo execution
    Jun 08 01:09:08 hspecter xsession[295672]: goroutine 1 [syscall]:
    Jun 08 01:09:08 hspecter xsession[295672]: runtime.cgocall(0x8680a0, 0xc0000d3ef0)
    Jun 08 01:09:08 hspecter xsession[295672]:         runtime/cgocall.go:157 +0x5c fp=0xc0000d3ec8 sp=0xc0000d3e90 pc=0x490c5c
    Jun 08 01:09:08 hspecter xsession[295672]: github.com/gotk3/gotk3/gtk._Cfunc_gtk_main()
    Jun 08 01:09:08 hspecter xsession[295672]:         _cgo_gotypes.go:17424 +0x45 fp=0xc0000d3ef0 sp=0xc0000d3ec8 pc=0x60ff85
    Jun 08 01:09:08 hspecter xsession[295672]: github.com/gotk3/gotk3/gtk.Main(...)
    Jun 08 01:09:08 hspecter xsession[295672]:         github.com/gotk3/[email protected]/gtk/gtk.go:1241
    Jun 08 01:09:08 hspecter xsession[295672]: main.run()
    Jun 08 01:09:08 hspecter xsession[295672]:         github.com/oxplot/pdfrankenstein/main.go:561 +0x8c fp=0xc0000d3f38 sp=0xc0000d3ef0 pc=0x85878c
    Jun 08 01:09:08 hspecter xsession[295672]: main.main()
    Jun 08 01:09:08 hspecter xsession[295672]:         github.com/oxplot/pdfrankenstein/main.go:568 +0x70 fp=0xc0000d3f80 sp=0xc0000d3f38 pc=0x858830
    Jun 08 01:09:08 hspecter xsession[295672]: runtime.main()
    Jun 08 01:09:08 hspecter xsession[295672]:         runtime/proc.go:250 +0x212 fp=0xc0000d3fe0 sp=0xc0000d3f80 pc=0x4c30d2
    Jun 08 01:09:08 hspecter xsession[295672]: runtime.goexit()
    Jun 08 01:09:08 hspecter xsession[295672]:         runtime/asm_amd64.s:1571 +0x1 fp=0xc0000d3fe8 sp=0xc0000d3fe0 pc=0x4ef081
    Jun 08 01:09:08 hspecter xsession[295672]: rax    0x0
    Jun 08 01:09:08 hspecter xsession[295672]: rbx    0x482f8
    Jun 08 01:09:08 hspecter xsession[295672]: rcx    0x7f73b3689c1f
    Jun 08 01:09:08 hspecter xsession[295672]: rdx    0x6
    Jun 08 01:09:08 hspecter xsession[295672]: rdi    0x482f8
    Jun 08 01:09:08 hspecter xsession[295672]: rsi    0x482f8
    Jun 08 01:09:08 hspecter xsession[295672]: rbp    0x7f73b37b3268
    Jun 08 01:09:08 hspecter xsession[295672]: rsp    0x7fff2b390480
    Jun 08 01:09:08 hspecter xsession[295672]: r8     0x7
    Jun 08 01:09:08 hspecter xsession[295672]: r9     0x26018c0
    Jun 08 01:09:08 hspecter xsession[295672]: r10    0x8
    Jun 08 01:09:08 hspecter xsession[295672]: r11    0x246
    Jun 08 01:09:08 hspecter xsession[295672]: r12    0x7f73b3362c13
    Jun 08 01:09:08 hspecter xsession[295672]: r13    0x16d
    Jun 08 01:09:08 hspecter xsession[295672]: r14    0x6
    Jun 08 01:09:08 hspecter xsession[295672]: r15    0x7fff2b390798
    Jun 08 01:09:08 hspecter xsession[295672]: rip    0x7f73b3689c1f
    Jun 08 01:09:08 hspecter xsession[295672]: rflags 0x246
    Jun 08 01:09:08 hspecter xsession[295672]: cs     0x33
    Jun 08 01:09:08 hspecter xsession[295672]: fs     0x0
    Jun 08 01:09:08 hspecter xsession[295672]: gs     0x0
    
  • Build fails

    Build fails

    Hi, I am trying to port your package to NixOS but currently facing some issues at build time :

    internal/unsafeheader
    runtime/internal/sys
    github.com/gotk3/gotk3/internal/slab
    unicode
    math/bits
    unicode/utf8
    internal/race
    encoding
    runtime/internal/atomic
    sync/atomic
    internal/cpu
    runtime/cgo
    runtime/internal/math
    internal/bytealg
    math
    runtime
    internal/reflectlite
    sync
    internal/testlog
    github.com/gotk3/gotk3/internal/callback
    errors
    sort
    internal/oserror
    path
    io
    strconv
    syscall
    bytes
    strings
    reflect
    bufio
    regexp/syntax
    internal/syscall/execenv
    internal/syscall/unix
    time
    regexp
    context
    io/fs
    internal/poll
    embed
    os
    internal/fmtsort
    path/filepath
    fmt
    io/ioutil
    os/exec
    github.com/gotk3/gotk3/internal/closure
    log
    net/url
    text/template/parse
    encoding/xml
    github.com/gotk3/gotk3/glib
    text/template
    github.com/oxplot/pdfrankenstein/session
    # github.com/oxplot/pdfrankenstein/session
    session/session.go:21:61: undefined: any
    note: module requires Go 1.18
    # github.com/gotk3/gotk3/glib
    cgo-gcc-prolog: In function '_cgo_26ff448d08b0_Cfunc_g_binding_get_source':
    cgo-gcc-prolog:71:2: warning: 'g_binding_get_source' is deprecated: Use 'g_binding_dup_source' instead [-Wdeprecated-declarations]
    In file included from /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/glib-object.h:22,
                     from /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/gio/gioenums.h:28,
                     from /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/gio/giotypes.h:28,
                     from /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/gio/gio.h:26,
                     from vendor/github.com/gotk3/gotk3/glib/gbinding.go:3:
    /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/gobject/gbinding.h:113:23: note: declared here
      113 | GObject *             g_binding_get_source          (GBinding *binding);
          |                       ^~~~~~~~~~~~~~~~~~~~
    cgo-gcc-prolog: In function '_cgo_26ff448d08b0_Cfunc_g_binding_get_target':
    cgo-gcc-prolog:107:2: warning: 'g_binding_get_target' is deprecated: Use 'g_binding_dup_target' instead [-Wdeprecated-declarations]
    In file included from /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/glib-object.h:22,
                     from /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/gio/gioenums.h:28,
                     from /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/gio/giotypes.h:28,
                     from /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/gio/gio.h:26,
                     from vendor/github.com/gotk3/gotk3/glib/gbinding.go:3:
    /nix/store/9hvamg7jyhmcww590z2g0gy1f8rkil6m-glib-2.70.1-dev/include/glib-2.0/gobject/gbinding.h:117:23: note: declared here
      117 | GObject *             g_binding_get_target          (GBinding *binding);
          |                       ^~~~~~~~~~~~~~~~~~~~
    github.com/gotk3/gotk3/cairo
    github.com/gotk3/gotk3/pango
    github.com/gotk3/gotk3/gdk
    github.com/gotk3/gotk3/gtk
    

    Please note that i'm not very experienced with Go and so this might be a stupid mistake from my side.

    Installed dependencies : gtk3 glib gdk-pixbuf inkscape poppler_utils qpdf

  • Build fails on Debian 11

    Build fails on Debian 11

    Hi there,

    great project! But build fails on Debian 11:

    ~/pdfrankenstein$ go build
    main.go:5:2: package embed is not in GOROOT (/usr/lib/go-1.15/src/embed)
    

    inkscape, poppler-utils and qpdf are installed:

    $ inkscape -V
    Inkscape 1.0.2 (e86c870879, 2021-01-15)
    Pango version: 1.46.2
    
    $ apt search poppler-utils
    poppler-utils/stable,now 20.09.0-3.1 amd64  [installiert]
      PDF-Werkzeuge (auf Basis von Poppler)
    
    $ qpdf --version
    qpdf version 10.1.0
    

    Any hint on this issue?

    Thanks!

  • Add cmdline parameter to open PDF

    Add cmdline parameter to open PDF

    Very nice Project! I think it is somewhat tedious to navigate through the folders inside the app, so I wonder how much effort it is to open a PDF directly when starting the program from shell?

    Thanks and keep it up!

  • No annotation after close inkscape/quit

    No annotation after close inkscape/quit

    Hi,

    First of all thanks for the app. I seems to be a great idea to offload the editing by inkscape and have all its power while the app manage the rest though I couldn't achieve this yet.

    I did this workflow:

    1. Open a PDF with PDFrankenstein and subsequently the inkscape opens and I did my annotations
    2. I save and close the document inside inkscape and came back to PDFrankenstein, nothing there. The whole app is inactive.
    3. I did quit inkscape, automatically PDFrankenstein also quits
    4. As I open the pdf there is no annotation there.

    Have I missed something here?

goldmark-pdf is a renderer for goldmark that allows rendering to PDF.
goldmark-pdf is a renderer for goldmark that allows rendering to PDF.

A PDF renderer for the goldmark markdown parser.

May 10, 2022
Golang wrapper for Exiftool : extract as much metadata as possible (EXIF, ...) from files (pictures, pdf, office documents, ...)

go-exiftool go-exiftool is a golang library that wraps ExifTool. ExifTool's purpose is to extract as much metadata as possible (EXIF, IPTC, XMP, GPS,

Jun 22, 2022
A PDF processor written in Go.
A PDF processor written in Go.

pdfcpu: a Go PDF processor pdfcpu is a PDF processing library written in Go supporting encryption. It provides both an API and a CLI. Supported are al

Jun 24, 2022
A simple library for generating PDF written in Go lang

gopdf gopdf is a simple library for generating PDF document written in Go lang. Features Unicode subfont embedding. (Chinese, Japanese, Korean, etc.)

Jun 26, 2022
A PDF document generator with high level support for text, drawing and images

GoFPDF document generator Package go-pdf/fpdf implements a PDF document generator with high level support for text, drawing and images. Features UTF-8

Jun 22, 2022
PDF tools for reMarkable tablets

rm-pdf-tools - PDF tools for reMarkable Disclaimer: rm-pdf-tools is currently in a very early version, bugs are to be expected. Furthermore, the inten

Jun 18, 2022
A command line tool for mainly exporting logbook records from Google Spreadsheet to PDF file in EASA format
A command line tool for mainly exporting logbook records from Google Spreadsheet to PDF file in EASA format

Logbook CLI This is a command line tool for mainly exporting logbook records from Google Spreadsheet to PDF file in EASA format. It also supports rend

Feb 6, 2022
A Docker-powered stateless API for PDF files.
A Docker-powered stateless API for PDF files.

Gotenberg provides a developer-friendly API to interact with powerful tools like Chromium and LibreOffice to convert many documents (HTML, Markdown, Word, Excel, etc.) to PDF, transform them, merge them, and more!

Jun 29, 2022
PDF file parser

#pdf A pdf document parsing and modifying library The libary provides functions to parse and show elements in PDF documents. It checks the validity

Nov 7, 2021
create PDF from ASCII File for Cable labels

CableLable create PDF from ASCII File for Cable labels file format is one label per line, a line containing up to 3 words, each word is a line on the

Nov 8, 2021
Convert document to pdf with golang

Convert document to pdf Build docker: docker build --pull --rm -f "Dockerfile" -t convertdocument:latest "." docker run -p 3000:3000 registry.gitlab.

Nov 29, 2021
Ghostinthepdf - This is a small tool that helps to embed a PostScript file into a PDF

This is a small tool that helps to embed a PostScript file into a PDF in a way that GhostScript will run the PostScript code during the

Jun 18, 2022
Read data from rss, convert in pdf and send to kindle. Amazon automatically convert them in azw3.

Kindle-RSS-PDF-AZW3 The Kindle RSS PDF AZW3 is a personal project. The Kindle RSS PDF AZW3 is a personal project. I received a Kindle for Christmas, a

Jan 10, 2022
Go-wk - PDF Generation API with wkhtmltopdf

Simple PDF Generation API with wkhtmltopdf Quick start Clone the repo locally an

Jan 25, 2022
Newser is a simple utility to generate a pdf with you favorite news articles
Newser is a simple utility to generate a pdf with you favorite news articles

Newser A simple utility to crawl some news sites or other resources and download content into a pdf Building Make sure you have config.yaml setup and

May 29, 2022
A bounding box labeler/annotator built in Go.
A bounding box labeler/annotator built in Go.

bounding box labeler A bounding box labeler/annotator built in Go. Can be cross compiled to any platform. Current releases are for Windows/Mac set und

Oct 4, 2021
A minimalist Go PDF writer in 1982 lines. Draws text, images and shapes. Helps understand the PDF format. Used in production for reports.
A minimalist Go PDF writer in 1982 lines. Draws text, images and shapes. Helps understand the PDF format. Used in production for reports.

one-file-pdf - A minimalist PDF generator in <2K lines and 1 file The main idea behind this project was: "How small can I make a PDF generator for it

Jul 2, 2022
Convert scanned image PDF file to text annotated PDF file
Convert scanned image PDF file to text annotated PDF file

Jisui (自炊) This tool is PoC (Proof of Concept). Jisui is a helper tool to create e-book. Ordinary the scanned book have not text information, so you c

Apr 7, 2022
Golang PDF library for creating and processing PDF files (pure go)

UniPDF - PDF for Go UniDoc UniPDF is a PDF library for Go (golang) with capabilities for creating and reading, processing PDF files. The library is wr

Jun 27, 2022
goldmark-pdf is a renderer for goldmark that allows rendering to PDF.
goldmark-pdf is a renderer for goldmark that allows rendering to PDF.

A PDF renderer for the goldmark markdown parser.

May 10, 2022