如何从命令行编辑 pdf 元数据?

bdr*_*529 121 command-line pdf metadata

我需要一个命令行工具来编辑 pdf 文件的元数据。

我正在使用 Aiptek MyNote Premium 平板电脑在此设备上编写我的笔记和会议记录,稍后导入它们并使用使用inkscape 和 ghostscript 的简单脚本将它们自动转换为 pdf。

是否有任何命令行工具可以将某些类别添加到 pdf 的元数据中,以便我稍后可以按类别找到 pdf(例如使用 gnome-do)?

更新:我尝试了 pdftk 的解决方案并且它有效,但似乎 gnome-do 不处理 pdf-metadata。有没有办法让 gnome-do 做到这一点?

Sab*_*con 140

试试 exiftool,它可以从存储库中的 libimage-exiftool-perl 包中获得。

例如,如果您有一个名为 drawing.pdf 的 pdf 文件,并且您想更新其元数据,请以这种方式使用实用程序 exiftool:

exiftool -Title="This is the Title" -Author="Happy Man" -Subject="PDF Metadata" drawing.pdf
Run Code Online (Sandbox Code Playgroud)

出于某种原因,输入的主题最终出现在 pdf 文件中元数据的关键字字段中。在某些情况下这不是问题,甚至是可取的,但是,这可能是有问题的,evince 和 nautilus 元数据预览器不显示这一点,但 Adob​​e Acrobat 查看器和 PDF-XChange 查看器可以。

如果您不使用,程序将创建原始文件的备份;-overwrite_original开关,这意味着更新的 pdf 所在的文件夹中将存在重复项。从上面的例子; 一个名为 ; 将创建drawing.pdf_original。

使用覆盖开关的风险由您自己承担,我的建议是不要使用它并编写一些脚本来将此文件移动到更好的位置以防万一。

  • 请注意:*"[所有元数据编辑都是可逆的](http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/PDF.html)。虽然这通常被认为是一个优势,但它是**潜在的安全问题**,因为旧信息**从未真正从文件中删除**。”* (29认同)
  • @nuttyaboutnatty 好吧,当然它不是权威来源,但这只是因为没有人花时间写一个。但是,我可以保证作者描述的方法有效。自己尝试一下: 1.) 使用带有一些标签的 PDF 并使用 `exiftool -overwrite_original -all:all="" file.pdf` 来“删除”所有元数据;2.) 使用 `exiftool -PDF-update:all=file.pdf` 确认仍然存在旧的元数据;3.) 使用 `qpdf --linearize file.pdf` 对文件进行线性化;4.) 再次检查,就像你在 2.) 中所做的那样;所有元数据都应该消失; (11认同)
  • @nuttyaboutnatty 如果您想清除所有剩余和未使用的元数据条目,您可以在使用 exiftool 处理 PDF 文件后立即对其进行线性化。这在 [this Github gist](https://gist.github.com/hubgit/6078384) 中有更详细的描述。 (9认同)
  • 5.) 通过查看 PDF 字典(`pdfinfo -meta file.pdf`)确认文件已清除所有元数据 (5认同)
  • 工作完美。我经常想将元数据从一个 PDF 复制到另一个 PDF,在这种情况下,“exiftool -overwrite_original -tagsFromFile <srcfile> <destfile>”就是我所需要的(选项“-overwrite_original”会覆盖原始的“<destfile>”)。 (2认同)

Oll*_*lli 22

您可以使用 编辑元数据pdftk。查看update_info参数。至于数据文件,下面是一个例子:

InfoKey: Title
InfoValue: Mt-Djing: multitouch DJ table
InfoKey: Subject
InfoValue: Dissertation for Master degree
InfoKey: Keywords
InfoValue: DJing, NUI, multitouch, user-centered design
InfoKey: Author
InfoValue: Pedro Lopes
Run Code Online (Sandbox Code Playgroud)

来源

  • 要使用pdftk,您需要做的是:1) `pdftk book.pdf dump_data output report.txt` 2) 编辑report.txt 3) `pdftk book.pdf update_info report.txt output bookcopy.pdf` (5认同)

Ser*_*ndt 10

使用 Ghostview

安装ghostscript

$ sudo apt install ghostscript
Run Code Online (Sandbox Code Playgroud)

创建一个以pdfmarks类似内容命名的文件:

[ /Title (Document title)
  /Author (Author name)
  /Subject (Subject description)
  /Keywords (comma, separated, keywords)
  /ModDate (D:20061204092842)
  /CreationDate (D:20061204092842)
  /Creator (application name or creator note)
  /Producer (PDF producer name or note)
  /DOCINFO pdfmark
Run Code Online (Sandbox Code Playgroud)

然后将此pdfmarks文件与 PDF、PS 或 EPS 输入文件合并:

gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=output.pdf original.pdf pdfmarks
Run Code Online (Sandbox Code Playgroud)

来源:http : //milan.kupcevic.net/ghostscript-ps-pdf/


小智 7

我需要清空从 LibreOffice 导出的 PDF 中的“作者”字段。上面列出的解决方案都不适合我,因此我使用hexedit并覆盖了作者字段。钝器但有效!

详细地:

  1. 跑步:

    $ hexedit file.pdf
    
    Run Code Online (Sandbox Code Playgroud)
  2. Tab切换到 ASCII。

  3. Ctrl+S搜索“作者”。

  4. 跳过<FEFF字段开头的 。

  5. 写下0所有字符(除了我保留了三个0x03字符...... YMMV)直到结束>

  6. Ctrl+X保存并退出。


小智 6

我广泛测试了 pdftk 和 exiftool 的功能。我在命令行和图形窗口中都使用了 exiftool。这些已经针对小型、中型和非常大的 PDF 文档进行了测试,发现在最大和最复杂的 PDF 文档中存在问题。根据我的经验,pdftk / exiftool 仅对于小型和简单格式的 PDF 文档具有顶级功能。对于大型且复杂的 PDF 文档(例如,超过 80 页的多种字体),在编辑元数据后,图像和/或字符可能会从最后几页中脱落。解决方案可能是使用我刚才看到的Ghostview。毫无疑问,这些计划会随着时间的推移而改进。

与此同时,我找到了一种解决方案,在 Ubuntu 中使用当前形式的 Wine 和一个单窗口小型免费软件程序,该程序也适用于这些大型、复杂的 PDF 文档:BeCyPDFMetaEdit(例如可以从 SoftPedia 等免费软件库中获得)。


CPB*_*PBL 5

要详细说明该pdftk方法,这很好,因为它向您显示了正在设置的所有内容,同时允许您更改您喜欢的任何内容,这里有一个脚本(用于您的.bashrc或其他别名文件)使用一个命令来完成。这会创建您要编辑的文件的新版本,使用元数据文件打开您喜欢的编辑器,然后实施您的更改并将修改后的 PDF 文件的文件创建/修改时间设置为与原始文件相同。要使用它,在资源化.bashrc文件后,只需输入

editPDFmetadata myfile.pdf

这是别名:

editPDFmetadata() {
OUTPUT="${1}-new.pdf"
METADATA="tmp${1}-report.txt"
pdftk "${1}" dump_data output "$METADATA"
$EDITOR "$METADATA"
pdftk "${1}" update_info "$METADATA"  output "$OUTPUT"
touch -r "${1}" "${OUTPUT}"
}
Run Code Online (Sandbox Code Playgroud)

只需将上面的定义放入.bashrc您的主文件夹中的文件中,然后打开一个新终端即可使用。