#include #include static GtkWidget *title_entry, *author_entry, *file_chooser; static PopplerDocument *current_document = NULL; static void show_error (const gchar *format, ...) { va_list args; gchar *msg; va_start (args, format); msg = g_strdup_vprintf (format, args); g_print ("%s\n", msg); g_free (msg); } static void move_file (const gchar *source, const gchar *dest) { GFile *f_source, *f_dest; GError *error = NULL; f_source = g_file_new_for_uri (source); f_dest = g_file_new_for_uri (dest); if (!g_file_move (f_source, f_dest, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)) { show_error ("Couldn't move %s to %s: %s", source, dest, error->message); g_error_free (error); } } static void entry_changed_cb (GtkEditable *editable, gpointer user_data) { gtk_widget_set_sensitive (GTK_WIDGET (user_data), TRUE); } static GtkWidget * create_entry (const gchar *title, GtkWidget *table, gint x1, gint x2, gint y1, gint y2, GtkWidget *button) { GtkWidget *label, *entry; label = gtk_label_new (title); gtk_table_attach (GTK_TABLE (table), label, x1, x2, y1, y2, GTK_FILL, GTK_FILL, 3, 3); gtk_widget_show (label); entry = gtk_entry_new (); g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (entry_changed_cb), button); gtk_table_attach (GTK_TABLE (table), entry, x2, x2 + 1, y1, y2, GTK_FILL, GTK_FILL, 3, 3); gtk_widget_set_sensitive (entry, FALSE); gtk_widget_show (entry); return entry; } static void file_selected_cb (GtkFileChooserButton *button, gpointer user_data) { gchar *file_uri; gtk_widget_set_sensitive (title_entry, TRUE); gtk_widget_set_sensitive (author_entry, TRUE); gtk_widget_set_sensitive (GTK_WIDGET (user_data), FALSE); if (current_document != NULL) g_object_unref (current_document); /* Load the PDF */ file_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (button)); if (file_uri) { GError *error = NULL; current_document = poppler_document_new_from_file (file_uri, NULL, &error); if (current_document != NULL) { gtk_entry_set_text (GTK_ENTRY (title_entry), poppler_document_get_title (current_document) ? poppler_document_get_title (current_document) : ""); gtk_entry_set_text (GTK_ENTRY (author_entry), poppler_document_get_author (current_document) ? poppler_document_get_author (current_document) : ""); } else { show_error ("Error loading %s: %s", file_uri, error->message); g_error_free (error); } g_free (file_uri); } } static void save_clicked_cb (GtkButton *button, gpointer user_data) { gchar *original_file, *temp_file; g_return_if_fail (POPPLER_IS_DOCUMENT (current_document)); original_file = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (file_chooser)); if (original_file != NULL) { GError *error = NULL; temp_file = g_strdup_printf ("%s.tmp", original_file); poppler_document_set_title (current_document, gtk_entry_get_text (GTK_ENTRY (title_entry))); poppler_document_set_author (current_document, gtk_entry_get_text (GTK_ENTRY (author_entry))); if (poppler_document_save (current_document, temp_file, &error)) { move_file (temp_file, original_file); gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE); } else { show_error ("Error saving %s: %s", original_file, error->message); g_error_free (error); } g_free (temp_file); } g_free (original_file); } int main (int argc, char *argv[]) { GtkWidget *dialog, *table, *label, *button; gtk_init (&argc, &argv); /* Create the main dialog */ dialog = gtk_dialog_new_with_buttons ("PDF Fixer", NULL, 0, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (gtk_main_quit), NULL); table = gtk_table_new (3, 4, FALSE); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), table, TRUE, TRUE, 3); gtk_widget_show (table); button = gtk_button_new_from_stock (GTK_STOCK_SAVE); gtk_widget_set_sensitive (button, FALSE); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (save_clicked_cb), NULL); gtk_table_attach (GTK_TABLE (table), button, 3, 4, 3, 4, GTK_FILL, GTK_FILL, 3, 3); gtk_widget_show (button); file_chooser = gtk_file_chooser_button_new ("Select PDF file", GTK_FILE_CHOOSER_ACTION_OPEN); g_signal_connect (G_OBJECT (file_chooser), "selection-changed", G_CALLBACK (file_selected_cb), button); gtk_table_attach (GTK_TABLE (table), file_chooser, 0, 4, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 3, 3); gtk_widget_show (file_chooser); title_entry = create_entry ("Title", table, 1, 2, 1, 2, button); author_entry = create_entry ("Author", table, 1, 2, 2, 3, button); /* Run the application */ gtk_widget_show (dialog); gtk_main (); return 0; }