识别 PDF 中的样式

识别 PDF 中的样式

很多时候,我看了一份有趣的 LaTeX 排版文档,但我没有源代码来检查样式。其中一个例子是:http://philosophy.unimelb.edu.au/ajl/2011/2011_5.pdf

我知道网上有免费字体识别服务。它们可能对简单的文本有用,但对于数学等文本,识别正确的字体就变得非常困难。

所以,我的问题是,当只能访问最终的 PDF 时,可以用什么来帮助重现特定的样式?

答案1

对于字体,您可以使用pdffonts

$ pdffonts charismanie.pdf
名称 类型 emb sub uni 对象 ID
------------------------------------ ----------------- --- --- --- ---------
BQFNPY+TimesNewRomanPS-ItalicMT CID TrueType 是 是 是 59 0
UQUJMH+Centennial-Roman CID TrueType 是 是 是 60 0
NSOUSR+LinLibertine 类型 1 是 是 否 137 0
NSOUSR+LinLibertine 类型 1 是 是 否 138 0
PTKESR+LinLibertineI 1 型 是 是 否 143 0
TYFIDZ+CMSY10 1型 是 是 否 144 0
MHUAJQ+LinLibertineB 类型 1 是 是 否 145 0
[无] 第 3 类 是 否 否 146 0
QTAYVE+LinBiolinumB 1 型 是 是 否 161 0
CXJGOW+CMR12 类型 1 是 是 否 207 0
PTKESR+LinLibertineI 1 型 是 是 否 285 0
PFIFSH+fourier-orns 1 型 是 是 否 465 0

编辑:pipitas 提供了一个很好的答案,其中包含-f-l选项pdffonts。为了更自动化地执行他的建议以在 PDF 中列出字体,这里有一个小脚本:

#!/bin/bash

# Parse options
RANGE=0
while getopts ":ap:f:l:g:" option; do
   case $option in
      a)
         RANGE=1
         ;;
      p)
         RANGE=1
         STARTPAGE=$OPTARG
         ENDPAGE=$STARTPAGE
         ;;
      f)
         RANGE=1
         STARTPAGE=$OPTARG
         ;;
      l)
         RANGE=1
         ENDPAGE=$OPTARG
         ;;
      g)
         GREP=1
         KEYWORD=$OPTARG
         ;;
      *)
         echo "Unknown option $option"
         exit 1
         ;;
  esac
done

shift $(($OPTIND - 1))
PDF="$1"

if [ -z "$PDF" ]; then
   echo "E: You must provide a PDF file"
   exit 1
fi

PAGES=$(pdfinfo $PDF | awk '/^Pages:/ { print $2 }')


if [ $RANGE = 1 ]; then
   for p in $(seq ${STARTPAGE:-1} ${ENDPAGE:-$PAGES}); do
      echo "== Fonts on page $p/$PAGES =="
      pdffonts -f $p -l $p $PDF
   done
elif [ $GREP = 1 ]; then
   FOUND=""
   for p in $(seq ${STARTPAGE:-1} ${ENDPAGE:-$PAGES}); do
      pdffonts -f $p -l $p $PDF | grep -q "^${KEYWORD} " && \
         FOUND="$FOUND $p"
   done
   if [[ -n $FOUND ]]; then
      echo "The font $KEYWORD was found on the following pages:$FOUND"
   else
      echo "The font $KEYWORD was not found"
   fi
else
   pdffonts $PDF
fi

这是一个 bash 脚本,用于 *nix 系统。这里,我将其保存为showfonts.sh)。

它的作用如下:

  • 没有任何选项,它只pdffonts在给定的 PDF 文件上执行;
  • 选项-a(对于all)执行pipitas建议的操作:它在每个页面上单独列出字体,例如:

    $ ./showfonts.sh -a charismanie.pdf
    
  • -p选项(用于page)列出了 PDF 特定页面上的字体,例如:

    $ ./showfonts.sh -p 15 charismanie.pdf
    
  • -f和选项-l(对于firstlast)相当于 中的相同选项pdffonts(因此-f 1相当于-a),例如:

    $ ./showfonts.sh -f 13 -l 16 charismanie.pdf
    
  • 选项-g(对于grep)可让您查找使用字体的页面,例如:

    $ ./showfonts.sh -g "LeagueGothic" charismanie.pdf
    

    它还使用通配符来匹配具有相似名称的字体,例如:

    $ ./showfonts.sh -g ".*Libertine.*" charismanie.pdf
    

该脚本现已在github上提交:https://github.com/raphink/listpdffonts

-g编辑:该脚本现在支持Kurt Pfeifle 要求的字体子集。请参阅 Git 存储库。

答案2

对于字体。如果查看Adobe Reader, 右键点击,文档属性..., 然后字体

答案3

@标记:

如果你想知道第 3 页的字体,请使用

pdffonts -f 3 -l 3 /路径/到/pdf

f第一的l最后的页面)。如果您想知道 10 页 PDF 中的哪一页上会出现哪种字体,请使用

对于 $(seq 1 10) 中的 p;执行
    pdffonts -f ${p} -l ${p} /路径/到/pdf
完毕

以上示例适用于 *nix 操作系统。如果你使用的是 Windows,请尝试

对于(1,1,10)中的%p,执行pdffonts -f%p -l%p

答案4

这似乎是《澳大利亚逻辑学杂志》的内部样​​式。他们要求使用文章类提交标准 LaTeX 文档,并且样式文件不对外公开。

相关内容