App-PDFLibrarian

 view release on metacpan or  search on metacpan

bin/pdf-lbr-import-pdf  view on Meta::CPAN

    croak "$Script: could not open PDF file '@{[$fh->filename]}': $error";
  };

  # use converted PDF file
  $fh->unlink_on_destroy(0);
  link($pdffile, "$pdffile.bak") or croak "$Script: could not link '$pdffile' to '$pdffile.bak': $!";
  rename($fh->filename, $pdffile) or croak "$Script: could not rename '@{[$fh->filename]}' to '$pdffile': $!";
  unlink("$pdffile.bak") or croak "$Script: could not unlink '$pdffile.bak': $!";

}

# add PDF files with existing BibTeX entries to library (unless --no-pdf-bib or --manual-entry was specified)
my @bibentries;
if (!$no_pdf_bib && !defined($manual_entry)) {

  # read BibTeX entries (if any) from PDF metadata
  my @allbibentries = read_bib_from_pdf(@pdffiles);

  # separate valid BibTeX entries, save PDF files without valid BibTeX entries
  @pdffiles = ();
  foreach my $bibentry (@allbibentries) {
    if ($bibentry->key ne ":") {
      push @bibentries, $bibentry;
    } else {
      push @pdffiles, $bibentry->get("file");
    }
  }
  undef @allbibentries;

  if (@bibentries > 0) {

    # regenerate keys for BibTeX entry
    generate_bib_keys(@bibentries);

    # write BibTeX entry to PDF metadata
    write_bib_to_pdf(@bibentries);

    # add PDF file to library
    update_pdf_lib(@bibentries);

    # add links in PDF links directory to real PDF file
    make_pdf_links(@bibentries);

    # cleanup PDF links directory
    cleanup_links();

  }

  # return if there are no PDF files remaining
  if (@pdffiles == 0) {
    exit 0;
  }

}

# process IDs of PDF files opened in external viewer
my @pids;

# try to retrieve BibTeX records for all PDF files, and write BibTeX data to a temporary file for editing
my $fh = File::Temp->new(SUFFIX => '.bib', EXLOCK => 0) or croak "$Script: could not create temporary file";
binmode($fh, ":encoding(iso-8859-1)");
my $havebibstr = 0;
$npdffile = 0;
PDFFILE: foreach my $pdffile (@pdffiles) {
  ++$npdffile;

  # open PDF file in external viewer
  my $pid = run_async 'xdg-open', $pdffile;

  # extract a DOI from PDF file, use for default query text
  my @query_values = extract_query_values_from_pdf($pdffile);
  my $query_value = (@query_values > 0) ? $query_values[0] : "";

  # ask user for query database and query text
  my $query_db_name = $pref_query_database;
  my $bibstr;
  my $error_message = '';
  do {

    # ask user for query database and query text (unless --manual-entry was specified)
    my $query_action = '';
    if (defined($manual_entry)) {
      $query_action = 'manual';
    } else {
      ($query_action, $query_db_name, $query_value) = do_query_dialog($pdffile, $query_db_name, $query_value, \@query_values, $error_message);
    }

    # take action
    if ($query_action eq 'exit') {

      # cancel all imports and exit
      kill_async $pid, @pids;
      print STDERR "$Script: all imports have been cancelled\n";
      exit 0;

    } elsif ($query_action eq 'cancel') {

      # skip import of PDF
      kill_async $pid;
      print STDERR "$Script: import of PDF file '$pdffile' has been skipped\n";
      next PDFFILE;

    } elsif ($query_action eq 'manual') {

      # assume article BibTeX entry by default
      if (!defined($manual_entry)) {
        $manual_entry = 'article';
      }
      $bibstr = "\@${manual_entry}{key,\n";

      # add fields
      foreach my $bibfield (keys %manual_field) {
        $bibstr .= "$bibfield = {$manual_field{$bibfield}},\n";
      }

      # end BibTeX entry
      $bibstr .= "}\n";

    } elsif ($query_action eq 'query') {

      # run query of database with given query value



( run in 0.531 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )