2017-05-17 1 views
1

MS Word 문서의 생성을 자동화하고 있습니다. 완료되면 PDF로 저장하고 다른/외부 PDF 페이지를 Word 문서의 PDF 버전에 삽입 할 수 있어야합니다. 이렇게하기 위해 자신의 페이지에 Word 문서에 마커 (예 : "[pdfGoesHere]")를 남겨 둘 계획이었습니다.python-docx를 사용하여 MS Word 단락의 시작 및 끝 페이지를 가져옵니다.

새 PDF 페이지를 삽입/교체하려면 마커가 어떤 페이지에 있는지 알고 있어야합니다. python-docx는 단락이 시작되고 끝나는 페이지 번호를 결정하는 방법이 있습니까? 나는 python-docx documentation을 읽었으며 이것에 대해서는 아무 것도 보이지 않습니다. 모든 단락을 검토하고 관심있는 단락을 찾을 수는 있지만 단락의 페이지 번호를 결정하는 방법을 찾을 수는 없습니다.

내가 할 일이 간과 되었습니까? 그렇지 않다면 PDF 페이지를 삽입하는 주요 목표를 달성하는 방법에 대한 다른 제안이 있습니까?

답변

0

내가 @scanny에 의해 주어진 의견을 보내 주셔서 감사합니다. python-docx에서이 작업을 수행 할 방법이 없기 때문에 어쨌든이 문서를 PDF로 변환하고 있으므로 Word 문서를 PDF로 변환 한 후 pdfminer을 사용하여 페이지 번호를 가져 오기로했습니다. 이 코드는 오래있을 수 있지만,이 후

import re 
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
from pdfminer.layout import LAParams 
from pdfminer.pdfpage import PDFPage 
from cStringIO import StringIO 

def xmlToLines(xml): 
    text = ''.join(xml) 
    return text.split('\n') 

#Convert a PDF found at the 'path' and turns it into XML lines 
#path is the full path directory to the PDF file you're reading from 
def convert_pdf_to_xml(path): 
    rsrcmgr = PDFResourceManager() 
    retstr = StringIO() 
    codec = 'utf-8' 
    laparams = LAParams() 
    device = XMLConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) 
    fp = file(path, 'rb') 
    interpreter = PDFPageInterpreter(rsrcmgr, device) 
    password = "" 
    maxpages = 0 
    caching = True 
    pagenos=set() 

    print 'Converting following file from PDF to XML: \n - ' + str(path) 
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True): 
     interpreter.process_page(page) 

    text = retstr.getvalue() 
    lines = xmlToLines(text) 

    #Close out pdf and I/O's 
    fp.close() 
    device.close() 
    retstr.close() 

    return lines 

#returns a list of every page number where the field marker is found in the PDF 
def getPagesWithField(wordPdfPath, field): 
    lines = convert_pdf_to_xml(wordPdfPath) 
    page_regex = r'page id="[0-9]*"' 
    t_regex = r'<text font=' 
    pagesFound = [] 
    text = '' 
    field = field.replace('<','&').replace('>','&') 
    for i in range(len(lines)): 
     #If it's a new page line, increment to the new page 
     if len(re.findall(page_regex, lines[i])) > 0: 
      page = int(re.findall(r'[0-9]{1,}', lines[i])[0]) 
      #print 'page: ' + str(page) 
     #If it's the end of a line 
     elif lines[i] == '<text>': 
      #print "Text: " + text 
      #check if the collected text is the field you're looking for 
      if field in text: 
       pagesFound.append(page) 
      text = '' 
     #If it's a line with a text character, add it to text 
     elif len(re.findall(t_regex, lines[i])) > 0: 
      text = str(text + re.findall(r'>[^\r\n]*</text>',lines[i])[0][1]) 

    pagesFound = list(set(pagesFound)) 
    pagesFound.sort()  
    return pagesFound 

을 일을 얻을, PyPDF2 내가에 마커를 배치 한 경우

1

짧은 대답은 아니오입니다. 페이지 번호는 렌더링 시간에 결정되며 사용 가능한 글꼴 같은 이유로 장치에 따라 다릅니다.

이 답변은 세부 사항을 더 있습니다 Page number python-docx

+0

어떤 옵션을 나에게 열어 수행 병합/간단한 PDF 페이지 삽입에 사용할 수 있습니다 페이지 나누기를 사용하는 모든 페이지? 또는 글꼴 렌더링 등의 문제로 인해 여전히 문제가 발생합니까? – Jed

+0

'python-docx' 자체에서 페이지 번호를 얻을 방법이 없습니다. 문서가 페이지 넘김을 막을 수있는 수동 페이지 나누기를 설정했다면 직접 계산할 수 있습니다. 그러나 콘텐츠가 가변적이라면 문제가 될 수 있습니다. – scanny