有什么方法可以将文本转换为路径?我尝试使用 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}
这需要一个lualatex
或xelatex
运行!
答案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(请参阅这里):
- 选择要转换的文本(提示:使用编辑对象>文本仅选择文本)
- 右键单击并按下底部的“转换为形状对象”按钮。
解决方案 2
Adobe Acrobat 也可以做到这一点(见这博客文章):
- 打开要处理的文档后,查看右侧,然后在工具面板点击更多工具按钮。
- 现在从这里输入搜索栏 飞行前检查并点击飞行前检查旁边印刷制作。
- 在现在打开的窗口中,选择个人资料。
- 确保您已按下搜索字段旁边的绿色条形按钮
- 进入转换字体进入该领域。
- 选择任何的将字体转换为轮廓个人资料并按下分析并修复按钮。
解决方案 3
或者,如果你不想使用这些专有工具,你可以使用mat2元数据删除工具,它还会将所有文本转换为路径。
- 安装后,用 调用它
mat2 /path/to/file.pdf
。 - 现在创建的文件
/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()