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 )