Skip to content

Instantly share code, notes, and snippets.

@rashomon-gh
Forked from nikhilweee/zotero.js
Last active March 26, 2026 11:48
Show Gist options
  • Select an option

  • Save rashomon-gh/17225c0aae1dd7f7b15a634e848e7cfe to your computer and use it in GitHub Desktop.

Select an option

Save rashomon-gh/17225c0aae1dd7f7b15a634e848e7cfe to your computer and use it in GitHub Desktop.
Zotero re-download missing PDFs
async function replacePDF(item) {
// filter annotations, attachments, notes
if (!item.isRegularItem()) {
return;
}
let fileExists = [];
let oldPDF = null;
// filter multiple or existing PDFs
const attachmentIDs = item.getAttachments();
for (let itemID of attachmentIDs) {
const attachment = Zotero.Items.get(itemID);
if (!attachment.isPDFAttachment()) {
continue;
}
oldPDF = attachment;
const exists = await attachment.fileExists();
fileExists.push(exists);
}
if (fileExists.length > 1) {
return; // multiple PDFs found
}
if (fileExists.pop()) {
return; // PDF already exists
}
console.log("Updating PDF for", item.getDisplayTitle());
// manually invoke "Find Available PDF"
const newPDF = await Zotero.Attachments.addAvailablePDF(item);
if (oldPDF && newPDF) {
// Replaced OS.File.move with IOUtils.move
await IOUtils.move(newPDF.getFilePath(), oldPDF.getFilePath());
await newPDF.eraseTx();
}
}
// loop replacePDF() over all items in our library
const libraryID = Zotero.Libraries.userLibraryID;
let items = await Zotero.Items.getAll(libraryID);
for (let item of items) {
await replacePDF(item);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment