解决方案 1

解决方案 1

有什么方法可以将文本转换为路径?我尝试使用 Inkscape,但它在读取 PDF 文件时遇到了一些麻烦。

PDF 是由pdflatex(我无法使用dvips)制作的,投影机类和投影海报包裹。

基本上,我知道 Type1 字体应该足够了,但是我们印刷办公室的人需要路径而不是文本。

答案1

尝试

pdftops -level3 myfile.pdf myfile.ps

(注意pdftops不是pdf2ps)然后使用 ghostscript 转换回 pdf,命令如下:

gswin32c -q -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dNOPAUSE -dPDFSETTINGS=/prepress -dAutoRotatePages=/None -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -sOutputFile=myfile-curves.pdf -c "/show { true charpath currentpoint /jy exch def /jx exch def fill jx jy moveto} bind def /ashow {exch pop exch /j_ax exch def show /j_ax {0} def } bind def /widthshow { show pop pop pop} bind def /awidthshow {ashow pop pop pop} bind def" -f myfile.ps

答案2

也适用于包beamerposter

\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage{pst-text}
\DeclareFixedFont{\RM}{T1}{ptm}{b}{n}{2cm}

\begin{document}

\begin{frame}{News}{}
\pscharpath{\RM Japan won}\par\pause
\pscharpath[fillstyle=solid,fillcolor=red!70]{\RM the World}\par\pause
\pscharpath[fillstyle=solid,fillcolor=blue!70]{\RM Cup}\par\pause
\end{frame}

\end{document}

在此处输入图片描述

填充可能性较少的替代方法是使用像 Biolinum 这样的轮廓字体:

\documentclass{beamer}
\usepackage{fontspec}
\setsansfont{Linux Biolinum O}
\newfontface\Outline{Linux Biolinum Outline O} 
\begin{document}

\begin{frame}{News}{}
\fontsize{40}{42}\selectfont\Outline
Japan won\par\pause
the World\par\pause
Cup\par\pause
\end{frame}
\end{document}

这需要一个lualatexxelatex运行!

在此处输入图片描述

答案3

我假设您想将整个文档转换为轮廓,在这种情况下,您可以使用pdf2ps实用程序将 PDF 转换为轮廓 PS 文件,然后可以使用ps2pdf将其转换回 PDF(两个实用程序均来自 Ghostscript)。

$ pdffonts test.pdf 
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
PEUCZM+Amiri-Regular                 CID TrueType      yes yes yes     18  0
$ pdf2ps test.pdf 
$ ps2pdf test.ps
$ pdffonts test.pdf 
name                                 type              emb sub uni object ID
---

答案4

解决方案 1

您可以使用 Foxit PhantomPDF(请参阅这里):

  1. 选择要转换的文本(提示:使用编辑对象>文本仅选择文本)
  2. 右键单击并按下底部的“转换为形状对象”按钮。

解决方案 2

Adobe Acrobat 也可以做到这一点(见博客文章):

  1. 打开要处理的文档后,查看右侧,然后在工具面板点击更多工具按钮。
  2. 现在从这里输入搜索栏 飞行前检查并点击飞行前检查旁边印刷制作
  3. 在现在打开的窗口中,选择个人资料
  4. 确保您已按下搜索字段旁边的绿色条形按钮
  5. 进入转换字体进入该领域。
  6. 选择任何将字体转换为轮廓个人资料并按下分析并修复按钮。

解决方案 3

或者,如果你不想使用这些专有工具,你可以使用mat2元数据删除工具,它还会将所有文本转换为路径。

  1. 安装后,用 调用它mat2 /path/to/file.pdf
  2. 现在创建的文件/path/to/file.cleaned.pdf应该将所有文本转换为路径。

解决方案 4

另一种方法是将文档的每一页转换为单独的 SVG 文件,然后重新转换并重新组合这些文件(取自StackOverflow 帖子)。

将页面转换为 SVG:

import os, math

import cairo
import poppler

def convert(inputname, base=None):
    '''Converts a multi-page PDF to multiple SVG files.

    :param inputname: Name of the PDF to be converted
    :param base: Base name for the SVG files (optional)
    '''
    if base is None:
        base, ext = os.path.splitext(os.path.basename(inputname))

    # Convert the input file name to an URI to please poppler
    uri = 'file://' + os.path.abspath(inputname)

    pdffile = poppler.document_new_from_file(uri, None)

    pages = pdffile.get_n_pages()

    # Prefix the output template with zeros so that ordering is preserved
    # (page 10 after page 09)
    output_template = ''.join([
        base,
        '_',
        '%0',
        str(math.ceil(math.log10(pages))),
        'd',
        '.svg'
    ])

    # Iterate over all pages
    for nthpage in range(pages):
        page = pdffile.get_page(nthpage)

        # Output file name based on template
        outputname = output_template % (nthpage + 1)

        # Get the page dimensions
        width, height = page.get_size()

        # Open the SVG file to write on
        surface = cairo.SVGSurface(outputname, width, height)
        context = cairo.Context(surface)

        # Now we finally can render the PDF to SVG
        page.render_for_printing(context)
        context.show_page()

        # Free some memory
        surface.finish()

将 SVG 组装成 PDF:

import rsvg
import cairo

def convert_merge(inputfiles, outputname):
    # We have to create a PDF surface and inform a size. The size is
    # irrelevant, though, as we will define the sizes of each page
    # individually.
    outputsurface = cairo.PDFSurface(outputname, 1, 1)
    outputcontext = cairo.Context(outputsurface)

    for inputfile in inputfiles:
        # Open the SVG
        svg = rsvg.Handle(file=inputfile)

        # Set the size of the page itself
        outputsurface.set_size(svg.props.width, svg.props.height)

        # Draw on the PDF
        svg.render_cairo(outputcontext)

        # Finish the page and start a new one
        outputcontext.show_page()

    # Free some memory
    outputsurface.finish()

相关内容