====== Custom PDF Resolvers ====== Custom resolvers for [[/blog/improved-pdf-retrieval-with-unpaywall-integration/|PDF retrieval]] currently can be configured via the ''extensions.zotero.findPDFs.resolvers'' hidden pref (Advanced preferences → Config Editor). The value should be a JSON string containing an array of configuration objects. HTML and JSON sources are supported. You may wish to distribute a custom resolver using a Zotero plugin that adds or updates the pref at startup. ===== Example: Extract a PDF link from a webpage ===== { "name": "My Paper Source", "method": "GET", "url": "https://example.com/{doi}", "mode": "html", "selector": "#pdf-link", "attribute": "href", "automatic": false } ''selector'' is a CSS-style selector. If ''attribute'' is omitted, the element's ''textContent'' is used. ''index'' can be passed to select a specific element of a set. If ''automatic'' is ''false'' or unspecified, the resolver will be used only for manual actions — Add Item by Identifier and Find Available PDFs — and not when saving from the browser. ===== Example: Extract PDF URLs from a JSON API ===== **Note:** The Unpaywall API is used here for demonstration purposes, but Zotero already uses its own mirror of Unpaywall data, so configuring it with a custom resolver isn't necessary. { "name": "Unpaywall", "method": "GET", "url": "https://api.unpaywall.org/v2/{doi}?email=me@example.com", "mode": "json", "selector": ".oa_locations.url_for_pdf", "automatic": true } ''selector'' uses [[https://github.com/dfilatov/jspath|JSPath]] syntax. In this case, ''.oa_locations.url_for_pdf'' matches zero or more URL strings in the ''url_for_pdf'' property in objects in the ''oa_locations'' array. However, Unpaywall can return either direct PDF URLs or landing page URLs, so matching on ''url_for_pdf'' alone isn't sufficient. For advanced cases like this, a ''mappings'' object can be provided to pull out specific values: { "name": "Unpaywall", "method": "GET", "url": "https://api.unpaywall.org/v2/{doi}?email=me@example.com", "mode": "json", "selector": ".oa_locations", "mappings": { "url": "url_for_pdf", "pageURL": "url_for_landing_page" }, "automatic": true } Here, the ''oa_locations'' array is matched directly, and ''mappings'' is used to assign the ''url_for_pdf'' and ''url_for_landing_page'' properties from the array objects to ''url'' (for a direct PDF link) and ''pageURL'' (for a page where a PDF can be translated).