我正在尝试使用PdfTron软件创建 PDF 编辑原型。
我已经成功创建了界面,用户可以单击图像,从 PDF 创建,选择区域,并将显示一个文本输入,然后他/她可以在其中输入文本,这将替换 PDF 文件中的内容。
现在文本替换部分有问题。由于没有 Python 的 API 文档(仅示例),我正在关注 Java / Android API 文档。
我现在在哪里。我有以下代码来找出用户选择的矩形中的元素。值x1
, y1
, x2
,y2
是基于前端用户选择的 PDF 坐标。
rect = Rect(x1, y1, x2, y2)
text = ''
extractor = TextExtractor()
extractor.Begin(page)
line = extractor.GetFirstLine()
words = []
while line.IsValid():
word = line.GetFirstWord()
while word.IsValid():
elRect = word.GetBBox()
elRect.Normalize()
if elRect.IntersectRect(elRect, rect):
text += ' ' + word.GetString()
words.append(word)
word = word.GetNextWord()
line = line.GetNextLine()
words
基本上是数组,我存储稍后需要替换为新元素的内容。
现在的问题。我希望新元素具有与旧文本相同的样式和字体。Api(链接)告诉我使用
style = words[0].GetStyle()
给了我单词的样式,我可以使用样式从样式中获取字体
font = style.GetFont()
文档:https ://www.pdftron.com/pdfnet/mobile/docs/Android/pdftron/PDF/TextExtractor.Style.html
但是这个返回font
的是Obj
类而不是Font
类。
显然用字体创建新的文本元素需要Font
类的对象。
因为
element = eb.CreateTextBegin(font, 10.0);
产生错误:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/alan/.virtualenvs/pdfprint/local/lib/python2.7/site-packages/PDFNetPython2.py", line 5056, in CreateTextBegin
def CreateTextBegin(self, *args): return _PDFNetPython2.ElementBuilder_CreateTextBegin(self, *args)
NotImplementedError: Wrong number or type of arguments for overloaded function 'ElementBuilder_CreateTextBegin'.
Possible C/C++ prototypes are:
pdftron::PDF::ElementBuilder::CreateTextBegin(pdftron::PDF::Font,double)
pdftron::PDF::ElementBuilder::CreateTextBegin()
也许有更好的方法来实现相同的结果?
编辑1
阅读文档我发现您可以Font
基于以下内容创建对象Object
:
font = Font(style.GetFont())
尽管如此,仍然坚持使用这些样式创建元素。
/编辑1
编辑2
我使用以下代码来测试写入文件:
style = elements[0].GetStyle()
font = Font(style.GetFont())
fontsize = style.GetFontSize()
eb = ElementBuilder()
element = eb.CreateTextBegin(font, 10.0)
writer.WriteElement(element)
element = eb.CreateTextRun('My Name')
element.SetTextMatrix(10, 0, 0, 10, 100, 100)
gstate = element.GetGState()
gstate.SetTextRenderMode(GState.e_fill_text)
gstate.SetStrokeColorSpace(ColorSpace.CreateDeviceRGB())
gstate.SetStrokeColor(ColorPt(1, 1, 1))
element.UpdateTextMetrics()
writer.WriteElement(element)
writer.WriteElement(eb.CreateTextEnd())
writer.End()
from core.helpers import ensure_dir
ensure_dir(output_filename)
doc.Save(output_filename, SDFDoc.e_linearized)
doc.Close()
我想不通的是:
- 如何从现有元素复制样式。
- 如何在文档中定位新元素。
- 为什么这个测试代码没有给我可见的结果。据我所知,新文件是由它创建的,其中任何地方都没有“我的名字”。
/编辑2