将字符串自动转换为 pdf 文档的链接
Posted
技术标签:
【中文标题】将字符串自动转换为 pdf 文档的链接【英文标题】:Converting a string automatically into a link to a pdf document 【发布时间】:2016-02-23 02:45:06 【问题描述】:我在这里和互联网上做了一些环顾四周,它似乎不是很明显,但我的问题是 python 使用 tkinter 是否可以用于自动将文本字符串转换为从某个方向加载 pdf 的链接
例如data '12345 Issue A' 在文本小部件中弹出,并自动转换为链接,单击该链接可打开 pdf 文档。
这能做还是不能做?
在这种情况下,我希望能够单击 1931-125、699-126 和 1851-127 并分别打开同名的 pdf 文件。这是在制造环境中使用的,允许装配工单击字段并拥有构建特定项目所需的所有文档
【问题讨论】:
这取决于您对“自动”的定义。您必须编写执行此操作的代码,但文本小部件当然有可能具有打开其他程序的链接。 完全没问题,如果不可能或模块不可用,我只是不想走这条路……我是新手,所以目标是可以实现的 :) 【参考方案1】:首先要对 Text 小部件的某些部分应用格式,您需要了解 tags,在大多数情况下,您可能只需使用链接的短语 (ABC123),请记住:
标签的名称可以是任何不包含空格或句点的字符串。
一旦你有一个链接标签,有两个部分:
-
格式化标签,使其看起来和反应像一个链接。
将标签应用于文本中的短语。
第一个非常简单,如果您只是希望它是蓝色并带有下划线并响应被点击:
def format_link(text_widget,tag,command):
text_widget.tag_config(tag,foreground="blue",underline=1)
text_widget.tag_bind(tag,"<Button-1>",command)#remember that the command will need to take an event argument
虽然如果您希望光标在悬停时更改或在单击后更改颜色等,这可能会变得更加复杂。
第二部分是将此标记应用于文本自动,我假设这意味着在将文本插入小部件后对其进行解析。这也很简单,只需将this answer 放入一个循环中,以便检查每个出现的短语:
def apply_tag(text_widget,phrase,tag,regexp=False):
countVar = tk.IntVar(text_widge)
idx = "1.0"
while idx:
idx = text_widget.search(phrase,idx, stopindex = "end",
count = countVar, regexp = regexp)
if idx:
end_idx = "%s + %sc" %(idx, countVar.get())
text_widget.tag_add(tag, idx, end_idx)
idx = end_idx
剩下的就是定义在另一个程序中打开文件的方式,然后调用上面的两个函数,使用os.system("open"...)
打开文件就可以这么简单:
def make_link(text,phrase,file_to_open):
def callback(event=None):
os.system("open %r"%file_to_open)#there are better ways of handling this
apply_tag(text,phrase,phrase)#uses phrase as tag
format_link(text,phrase,callback)
虽然您可能想查看 answers here 或 it's duplicate 以了解打开文件的替代方法。
在将文本插入小部件后,假设您有某种短语列表可以转换为链接,您可以遍历这些短语并为每个短语调用 make_link
:
phrases = "1931-125", "699-126", "1851-127"
for s in phrases:
make_link(TEXT_W, s, s+".pdf") #make a link to same name with .pdf added to end.
【讨论】:
此方法是否允许您(通过代码修改)将文本转换为可点击文本名称保持不变但现在指向特定位置和文件名?例如,我的“结果”文本小部件给了我 ABC123,我希望它现在显示为 ABC123(但现在可以单击),当单击它时,它会在计算机上的某个目录中查找文件 ABC123,在本例中为 ABC。 pdf - 希望这是有道理的 我重新回答了这个问题,以后会尽量避免不必要的冗长或复杂的答案。 我知道这是对一个老问题的回答(我们的第二个孩子已经离开了一段时间),我只是想验证上述内容是否适用于文本小部件中的多行,每个小部件都有不同的文字。我添加了我的程序的屏幕截图,它可能有助于实现我想要实现的目标。第一行 1931-125 我希望标记,并将其与位于目录中的同名 pdf 文件关联,然后我希望与第二行 699-126 等重复。目标是一个人可以单击每个系列的数字并打开不同的 pdf 文档。 当然,只需为每个要制作的链接调用make_link
,如果有帮助,我会在最后添加一点。
谢谢 :) 使用您的词组代码 - 词组 = “1931-125”、“699-126”、“1851-127”,可以使用字符串代替硬编码数字吗?原因是“工作 x”将有与“工作 y”不同的图纸,如果我有几百个工作,每个工作都有不同的图纸,那么它需要大量的维护。我设想当我的 csv 行被读入(以及所有相关的绘图信息)时,这些绘图编号将存储为字符串,然后用作短语 - 如果这是最好的方法。以上是关于将字符串自动转换为 pdf 文档的链接的主要内容,如果未能解决你的问题,请参考以下文章
在不使用 Office 自动化的情况下将办公文档转换为 PDF 的开源解决方案 [关闭]
办公自动化:几行代码将PDF文档转换为WORD文档(代码实战)!