Python có thể mở tài liệu từ không?

Để chuẩn bị cho thị trường việc làm, tôi bắt đầu đánh bóng CV của mình. Tôi cố gắng giữ CV trên trang web của mình cập nhật nhất có thể, nhưng nhiều nhà tuyển dụng và công ty thích CV gọn gàng trên một trang trong tài liệu Microsoft Word. Tôi đã từng luôn tạo CV của mình bằng LaTeX, nhưng có vẻ như Word thường được ưu tiên hơn vì nó dễ chỉnh sửa hơn cho bên thứ ba

Giữ cho cả phiên bản web, Word và PDF đều được cập nhật và dễ chỉnh sửa dường như là một nhiệm vụ khó chịu. Tôi có nhiều kinh nghiệm với việc tự động tạo tài liệu PDF bằng LaTeX và Python, vì vậy tôi đã hiểu tại sao tài liệu Word lại khác?

May mắn thay có một thư viện cho việc này.

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Nó có thể được sử dụng để tạo tài liệu Word từ đầu, nhưng cách điệu tài liệu hơi phức tạp. Thay vào đó, sức mạnh thực sự của nó nằm ở việc chỉnh sửa các tài liệu được tạo sẵn. Tôi đã tiếp tục và tạo một CV đẹp mắt trong Word, và bây giờ hãy mở tài liệu này trong
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Một tài liệu Word được lưu trữ dưới dạng XML và có thể có một cấu trúc cây phức tạp đối với một tài liệu. Tuy nhiên, chúng ta có thể tạo một tài liệu và sử dụng thuộc tính
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
1 để có danh sách đầy đủ tất cả các đoạn văn trong tài liệu. Hãy lấy một đoạn văn và in nội dung văn bản của nó

from docx import Document

document = Document["resume.docx"]
paragraph = document.paragraphs[0]
print[paragraph.text]

Hóa ra đoạn đầu tiên có tên tôi. Chỉnh sửa văn bản này rất dễ dàng; . Hãy làm điều này và bảo vệ tài liệu

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]

Dưới đây là hình ảnh về sự thay đổi kết quả; . phông chữ của đoạn đã chỉnh sửa đã thay đổi và thanh / hộp văn bản ở phía bên tay phải biến mất hoàn toàn

Điều này không tốt, nhưng để hiểu điều gì đã xảy ra với hộp văn bản, chúng ta cần tìm hiểu sâu về XML của tài liệu. Chúng ta có thể biến tài liệu thành một tệp XML như vậy

document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]

Có vẻ như vấn đề là hộp văn bản bên phải được lồng vào bên trong một đối tượng khác, dường như không được xử lý đúng cách. Sự cố này rất dễ khắc phục bằng cách sửa đổi tài liệu Word. Tuy nhiên, thanh bên phải ở bên cạnh bao gồm 2 hộp văn bản và hộp trên cùng có thông tin liên hệ của tôi sẽ biến mất nếu tôi thay đổi đoạn đầu tiên. Nhưng, nó không biến mất nếu tôi thay đổi đoạn thứ hai; . Tôi đã thử chèn hai đoạn trước đoạn cụ thể này hoặc thay đổi kiểu của đoạn cụ thể này, nhưng vấn đề vẫn còn

Nhìn vào XML vấn đề là rõ ràng. phần tử hộp văn bản nằm trong đoạn này. Hóa ra hơi khó để tránh điều này, vì vậy bây giờ chúng ta hãy thử thay đổi đoạn thứ hai, thay từ “sơ yếu lý lịch” thành “sơ yếu lý lịch”

document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]

Nếu chúng tôi làm điều này thì không có vấn đề gì với các hộp văn bản biến mất, nhưng tiếc là kiểu của đoạn văn này vẫn được đặt lại khi chúng tôi làm điều này. Hãy xem XML thay đổi như thế nào khi chúng ta chỉnh sửa đoạn này. Bỏ qua những thông tin không liên quan, trước khi thay đổi thì nó như thế này

________số 8_______

Và sau đó nó trông như thế này


    
    Curriculum Vitae
    

Trong Word, mỗi đoạn [

] được chia thành nhiều lần chạy [

document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3]. Những gì chúng ta thấy ở đây là ban đầu đoạn văn có hai lần chạy và sau khi sửa đổi nó, nó trở thành một lần chạy. Tuy nhiên, có vẻ như trong cả hai trường hợp, thông tin về kiểu dáng hoàn toàn giống nhau, vì vậy tôi không hiểu tại sao kiểu dáng lại thay đổi sau khi sửa đổi. Trong trường hợp này, nếu tôi gõ lại từ 'Resume' trong tài liệu từ gốc, đoạn này sẽ trở thành một lần chạy, nhưng phong cách vẫn thay đổi sau khi chỉnh sửa và tôi vẫn không hiểu tại sao điều này lại xảy ra khi xem XML

Nhìn vào mã nguồn của

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9, tôi nhận thấy rằng khi chúng tôi gọi
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
5, điều xảy ra là nội dung của đoạn đó bị xóa và sau đó một lần chạy mới được thêm vào với văn bản mong muốn. Tôi không rõ chính xác nơi lưu trữ thông tin kiểu dáng, nhưng dù bằng cách nào thì cũng có một cách giải quyết đơn giản cho những gì chúng tôi đang cố gắng thực hiện. chúng ta có thể chỉ cần sửa đổi văn bản của lần chạy đầu tiên trong đoạn văn, thay vì xóa toàn bộ đoạn văn và thêm đoạn văn mới. Trên thực tế, điều này cũng hoạt động để chỉnh sửa đoạn đầu tiên, nơi mà trước đây chúng tôi gặp sự cố với các hộp văn bản biến mất

document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]

# Change 'Rik Voorhaar' for 'Willem Hendrik Voorhaar'
paragraph = document.paragraphs[0]
run = paragraph.runs[1]
run.text = 'Willem Hendrik Voorhaar'

# Change 'Resume' for 'Curriculum Vitae'
paragraph = document.paragraphs[1]
run = paragraph.runs[0]
run.text = 'Curriculum Vitae'
document.save['CV.docx']

Thao tác này sẽ thay đổi văn bản nhưng giữ nguyên tất cả thông tin về kiểu dáng. Được rồi, bây giờ chúng ta làm thế nào để chỉnh sửa văn bản. Nó phức tạp hơn người ta có thể mong đợi, nhưng nó hoạt động

Xử lý các hộp văn bản

Giả sử rằng tiếp theo chúng tôi muốn chỉnh sửa hộp văn bản ở phía bên phải của tài liệu và thêm một kỹ năng vào danh sách các kỹ năng của chúng tôi. Chúng tôi đã đi sâu vào hoạt động bên trong của các tài liệu Word, vì vậy thật công bằng khi nói rằng chúng tôi biết cách sử dụng Microsoft Word, vì vậy hãy thêm kỹ năng “Microsoft Word” vào danh sách

Để làm điều này, trước tiên chúng tôi muốn tìm ra đoạn nào thông tin này được lưu trữ. Chúng ta có thể làm điều này bằng cách xem qua tất cả các đoạn văn trong tài liệu và tìm kiếm văn bản “Kỹ năng”

import re
pattern = re.compile["Skills"]
for p in document.paragraphs:
    if pattern.search[p.text]:
        print["Found the paragraph!"]
        break
else:
    print["Did not find the paragraph :["]

Did not find the paragraph :[

Có vẻ như rất tiếc là không có đoạn phù hợp. Điều này là do đoạn chúng tôi muốn nằm trong hộp văn bản và việc sửa đổi hộp văn bản không được hỗ trợ trong

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Đây là sự cố đã biết, nhưng thay vì từ bỏ, tôi đã quyết định tự mình bổ sung hỗ trợ sửa đổi hộp văn bản cho
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Hóa ra nó không quá khó để thực hiện, mặc dù kiến ​​thức hạn chế của tôi về cả gói và cấu trúc bên trong của tài liệu Word

Bước đầu tiên là hiểu cách các hộp văn bản được mã hóa trong XML. Nó chỉ ra rằng cấu trúc là một cái gì đó như thế này


    
        
            
                
                    
                        
                            
                            ...
                            
                        
                                     
                
            
        
    
    
        
            
                
                ...
                
            
        
    

Phần bên trong của hai phần tử

document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3 hoàn toàn giống hệt nhau. Thông tin được lưu trữ hai lần có thể vì lý do cũ. Google nhanh chóng tiết lộ rằng
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
9 là một không gian tên XML được giới thiệu trong Office 2010 và WPS là viết tắt của Word Processing Shape. Do đó, hộp văn bản được lưu trữ hai lần để duy trì khả năng tương thích ngược với các phiên bản Word cũ hơn. Không chắc nhiều người vẫn sử dụng Office 2006… Dù bằng cách nào, điều này có nghĩa là nếu chúng tôi muốn cập nhật nội dung của hộp văn bản, chúng tôi cần thực hiện ở hai nơi

Tiếp theo, chúng ta cần tìm ra cách thao tác với các đối tượng từ này. Ý tưởng của tôi là tạo một lớp

document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
0, được liên kết với một phần tử
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3 và đảm bảo rằng cả hai phần tử
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3 luôn được cập nhật cùng một lúc. Đầu tiên chúng ta tạo một lớp mã hóa một phần tử
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3. Đối với điều này, chúng ta có thể xây dựng trên lớp
document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
4 đã được triển khai trong
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Trộn trong lớp này cung cấp hỗ trợ tự động để thao tác các đoạn bên trong vùng chứa

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
0

Với một đối tượng

document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3, chúng ta có thể truy cập hai phần tử
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3 bằng cách sử dụng các đặc tả XPath sau

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
1

Sau đó, tạo một lớp

document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
0 thô sơ rất đơn giản. Chúng tôi căn cứ vào lớp
document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
9 trong
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Lớp này dùng để lưu trữ và thao tác với phần tử con của một phần tử XML

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
2

Cho đến nay, điều này chỉ tốt cho việc lưu trữ hộp văn bản, chúng tôi vẫn cần một số mã để thực sự thao tác với nó. Sẽ thật tuyệt nếu chúng ta có cách tìm tất cả các hộp văn bản trong tài liệu. Điều này đơn giản như việc tìm tất cả các phần tử

document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3 với chính xác hai phần tử
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3. Chúng ta có thể sử dụng chức năng sau

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
3

Sau đó, chúng tôi cập nhật lớp


    
    R
    
    
    esume
    

3 với thuộc tính

    
    R
    
    
    esume
    

4 mới

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
4

Bây giờ hãy kiểm tra điều này

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
5

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
6

Bây giờ để thao tác với phần “Kỹ năng” như mong muốn ban đầu, trước hết chúng ta tìm đúng đoạn. Vì hai đối tượng

document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
	f.write[document._element.xml]
3 có cùng đoạn văn, nên chúng ta cần tìm xem đoạn văn nào chứa văn bản và trong hộp văn bản nào

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
7

Bây giờ để chèn một kỹ năng mới, chúng ta cần tạo một đoạn mới với văn bản “Microsoft Word”. Đối với điều này, chúng ta có thể tìm thấy đoạn văn ngay sau đó và phương pháp


    
    R
    
    
    esume
    

6 của đoạn văn này với thông tin về văn bản và phong cách phù hợp. Đoạn văn được đề cập là đoạn văn có chứa từ “Research”. Tôi muốn sao chép kiểu của đoạn này sang đoạn mới, nhưng vì lý do nào đó, thông tin về kiểu trống cho đoạn này. Tuy nhiên, tôi biết rằng phong cách của đoạn văn này phải là

    
    R
    
    
    esume
    

7, vì vậy tôi chỉ có thể sử dụng nó trực tiếp

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
8

Bây giờ khi mở tài liệu Word, chúng tôi thấy mục “Microsoft Word” trong danh sách các kỹ năng của tôi, với đúng phong cách và mọi thứ. Tôi đã gian lận một chút; . Nếu bạn muốn sử dụng tính năng này, bạn có thể sử dụng ngã ba python-docx của tôi. Giải pháp của tôi vẫn còn một chút rắc rối, vì vậy tôi không nghĩ rằng nó sẽ được thêm vào kho lưu trữ chính, nhưng nó hoạt động tốt cho mục đích của tôi

Phần kết luận

Tóm lại, chúng ta có thể sử dụng Python để soạn thảo văn bản word. Tuy nhiên, gói

paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9 chưa hoàn thiện và việc sử dụng nó để chỉnh sửa các tài liệu từ có tính cách điệu cao hơi khó khăn [nhưng có thể. ]. Tuy nhiên, nó khá dễ dàng để mở rộng với chức năng mới, trong trường hợp bạn cần làm điều này. Mặt khác, có khá nhiều chức năng trong Visual Basic để chỉnh sửa tài liệu từ và toàn bộ API Word được xây dựng xung quanh Visual Basic

Mặc dù hiện tại tôi có sẵn tất cả các công cụ để tự động cập nhật CV của mình bằng Python, nhưng tôi thực sự sẽ không làm điều đó. Rất nhiều việc phải làm để thiết lập đúng cách và cần được bảo trì tích cực bất cứ khi nào tôi muốn thay đổi kiểu dáng CV của mình. Có lẽ sẽ tốt hơn nếu chỉ chỉnh sửa thủ công mỗi khi tôi cần. Tự động hóa không phải lúc nào cũng xứng đáng. Nhưng tôi sẽ không ngạc nhiên nếu kỹ năng mới được tìm thấy này sẽ hữu ích cho tôi vào một thời điểm nào đó trong tương lai.

Bài viết gần đây

Ngày 10 tháng 3 năm 2022
16 phút đọc

Hệ thống bình phương nhỏ nhất tuyến tính xuất hiện ở khắp mọi nơi và có nhiều cách nhanh chóng để giải quyết chúng. Chúng ta sẽ xem xét một cách như vậy. GMRES

Ngày 10 tháng 3 năm 2022
18 phút đọc

Gần đây chúng tôi đã viết một bài báo về học máy có giám sát bằng cách sử dụng tenxơ, đây là ý chính về cách thức hoạt động của nó

Ngày 26 tháng 9 năm 2021
10 phút đọc

Rất nhiều dữ liệu tự nhiên là 'thứ hạng thấp'. Tôi sẽ giải thích điều này có nghĩa là gì và cách khai thác sự thật này

Ngày 29 tháng 8 năm 2021
6 phút đọc

Tự động phân tích cú pháp và chỉnh sửa tài liệu Word có thể cực kỳ hữu ích, nhưng thực hiện nó trong Python không đơn giản như vậy

31 Tháng Năm, 2021
6 phút đọc

Cuối cùng, hãy xem cách chúng ta có thể tự động làm sắc nét hình ảnh mà không cần biết chúng bị mờ như thế nào ngay từ đầu

Ngày 2 tháng 5 năm 2021
5 phút đọc

Việc giải mã và làm sắc nét hình ảnh thực sự khá phức tạp. Chúng ta hãy xem xét một số phương pháp nâng cao hơn để giải chập

9 Tháng Tư, 2021
10 phút đọc

Để tự động làm sắc nét hình ảnh, trước tiên chúng ta cần hiểu cách máy tính có thể đánh giá mức độ 'tự nhiên' của một hình ảnh

python có thể chỉnh sửa tài liệu từ không?

Chỉnh sửa văn bản trong tài liệu bằng Python . Nó đã sẵn sàng để sử dụng trong công nghiệp và cung cấp đầy đủ các hoạt động để sửa đổi Word, PDF và các định dạng tệp khác. Chèn các thành phần tài liệu mới. Python library is a stand-alone solution to edit documents which doesn't need Microsoft Word or Acrobat Reader installed. It is ready for industrial use and provides the full range of operations to modify Word, PDF and other file formats: Insert new document elements.

Làm thế nào để đọc docx trong gấu trúc?

Xử lý dữ liệu bảng thành pandas dataframe. Sử dụng các thuộc tính có sẵn của thư viện python-docx, đọc từng hàng của bảng và truy xuất văn bản từ từng ô và tạo danh sách python gồm danh sách chứa từng hàng. Then convert that python data structure to pandas DataFrame.

Chủ Đề