Để 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àng cập nhật càng tốt, nhưng nhiều nhà tuyển dụng và công ty thích một CV gọn gàng một trang trong tài liệu Microsoft Word. Tôi đã từng luôn tạo CV CV của mình trong latex, nhưng có vẻ như Word thường được ưa thích vì nó dễ dàng chỉnh sửa cho các bên thứ ba dễ dàng hơn.
Giữ cả phiên bản web, từ và pdf đều cập nhật và dễ chỉnh sửa có vẻ như là một nhiệm vụ khó chịu. Tôi có rất nhiều kinh nghiệm với việc tự động tạo các tài liệu PDF bằng latex và python, vì vậy tôi đã hình dung tại sao một tài liệu từ nên khác nhau? Hãy cùng đi sâu vào thế giới chỉnh sửa các tài liệu từ trong Python!
May mắn thay, có một thư viện cho điều này:
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Nó có thể được sử dụng để tạo các tài liệu từ từ đầu, nhưng việc cách điệu một tài liệu là một chút khó khăn. Thay vào đó, sức mạnh thực sự của nó nằm trong việc chỉnh sửa các tài liệu được tạo sẵn. Tôi đã đi trước và tạo ra một CV đẹp mắt trong Word, và bây giờ hãy để Lừa 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ữ trong XML dưới mui xe và có thể có một cấu trúc cây phức tạp cho một tài liệu. Tuy nhiên, chúng tôi 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 cho một danh sách đầy đủ tất cả các đoạn trong tài liệu. Hãy để một đoạn văn và in nó nội dung văn bản.from docx import Document
document = Document["resume.docx"]
paragraph = document.paragraphs[0]
print[paragraph.text]
Hóa ra đoạn đầu tiên chứa tên của tôi! Chỉnh sửa văn bản này rất dễ dàng; Chúng ta chỉ cần đặt một giá trị mới cho thuộc tính
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
f.write[document._element.xml]
2. Hãy để làm điều này và an toàn cho tài liệu.paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
Dưới đây là hình ảnh của sự thay đổi kết quả; Thật không may, có vẻ như hai điều bổ sung đã xảy ra khi chỉnh sửa đoạn văn này: Phông chữ của đoạn văn đã thay đổi và hộp thanh / 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 những gì đã xảy ra với hộp văn bản, chúng ta cần đào sâu vào 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 bên trong một đối tượng khác, điều này rõ ràng không được xử lý đúng cách. Vấn đề này rất dễ khắc phục bằng cách sửa đổi tài liệu từ. 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 với thông tin liên lạc 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; Nó chỉ xảy ra nếu tôi thay đổi đoạn 1 hoặc 3 [và cái sau trống rỗng]. Tôi đã thử chèn hai đoạn trước đoạn văn cụ thể này hoặc thay đổi phong cách của đoạn cụ thể này, nhưng vấn đề vẫn còn.
Nhìn vào XML, vấn đề rất rõ ràng: Phần tử hộp văn bản nằm trong đoạn văn này! Hóa ra có một chút khó khăn để 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 đổi từ ngữ sơ yếu lý lịch cho chương trình giảng dạy của nhóm Vitae Vitae.
document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
Nếu chúng ta 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 thật không may, phong cách của đoạn này vẫn được thiết lập lại khi chúng ta làm điều này. Hãy để một cái nhìn về cách XML thay đổi khi chúng ta chỉnh sửa đoạn này. Bỏ qua thông tin không liên quan, trước khi thay đổi có vẻ như sau:
R
esume
Và sau đó có vẻ như thế này:
Curriculum Vitae
Trong Word, mỗi đoạn [
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
f.write[document._element.xml]
3] đượ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]
4]. Những gì chúng ta thấy ở đây là ban đầu đoạn văn là hai lần chạy, và sau khi sửa đổi nó, nó đã trở thành một lần chạy duy nhất. Tuy nhiên, có vẻ như trong cả hai trường hợp, thông tin phong cách hoàn toàn giống nhau, vì vậy tôi không hiểu tại sao phong cách thay đổi sau khi sửa đổi. Trong trường hợp này nếu tôi getpe từ ‘tiếp tục trong tài liệu từ gốc, đoạn này trở thành một lần chạy duy nhất, nhưng vẫn là kiểu thay đổi sau khi chỉnh sửa và tôi vẫn không thấy lý do tại sao điều này xảy ra khi nhìn vào 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 ta gọi document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
f.write[document._element.xml]
6, điều xảy ra là nội dung của đoạn văn sẽ 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. Không rõ ràng với tôi về chính xác thông tin kiểu được lưu trữ, nhưng dù sao đi nữa, 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 tôi chỉ có thể 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 một đoạn mới. Điều này trên thực tế cũng hoạt động để chỉnh sửa đoạn đầu tiên, trong đó trước khi chúng tôi gặp vấn đề 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']
Làm điều này thay đổi văn bản, nhưng để lại tất cả các thông tin phong cách giống nhau. Được rồi, bây giờ chúng ta làm thế nào để chỉnh sửa văn bản. Nó khó khăn 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
Hãy nói 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 các hoạt động bên trong của các tài liệu từ, 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 của Microsoft 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 trải qua tất cả các đoạn văn trong tài liệu và tìm kiếm các kỹ năng văn bản.
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ư không may không có đoạn văn phù hợp! Điều này là do đoạn mà chúng tôi muốn nằm trong hộp văn bản và các hộp văn bản sửa đổi không được hỗ trợ trong
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Đây là một vấn đề đã biết, nhưng thay vì từ bỏ, tôi quyết định thêm hỗ trợ để sửa đổi các hộp văn bản thành paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9! Hóa ra không quá khó thực hiện, mặc dù tôi có kiến thức hạn chế về cả gói và cấu trúc bên trong của các tài liệu từ.Bước đầu tiên là hiểu cách các hộp văn bản được mã hóa trong XML. Hóa ra cấu trúc là một cái gì đó như thế này:
...
...
Bên trong của hai yếu tố
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
f.write[document._element.xml]
9 giống hệt nhau. Thông tin được lưu trữ hai lần có lẽ vì lý do di sản. Một Google nhanh chóng tiết lộ rằng document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
0 là không gian tên XML được giới thiệu trong Office 2010 và WPS viết tắt cho hình dạng xử lý văn bản. 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 từ cũ hơn. Không chắc chắn 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 ta muốn cập nhật nội dung của hộp văn bản, chúng ta cần phải làm điều đó ở hai nơi.Tiếp theo chúng ta cần tìm ra cách thao túng 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"]
1, được liên kết với phần tử document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
2 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]
9 luôn được cập nhật cùng một lúc. Đầu tiên chúng tôi 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]
9. Đối với điều này, chúng tôi 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"]
5 đã đượ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 container.paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
0Đưa ra một đối tượng
document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
2, 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]
9 bằng các thông số kỹ thuật XPath sau:paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
1Sau đó tạo ra một lớp
document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
1 thô sơ rất đơn giản. Chúng tôi dựa trên lớp
R
esume
0 trong paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9. Lớp học này có nghĩa là để lưu trữ và thao túng trẻ em của một yếu tố XML.paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
2Cho đến nay, điều này chỉ tốt để 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 nó. Cũng sẽ tuyệt vời nếu chúng ta có cách tìm tất cả các hộp văn bản trong một tài liệu. Điều này đơn giản như tìm thấy tất cả các yếu tố
document = Document["resume.docx"]
paragraph = document.paragraphs[1]
print[paragraph.text]
paragraph.text = "Curriculum Vitae"
document.save["CV.docx"]
2 với chính xác hai yếu tố document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
f.write[document._element.xml]
9. Chúng ta có thể sử dụng chức năng sau:paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
3Sau đó, chúng tôi cập nhật lớp
R
esume
4 với thuộc tính
R
esume
5 mới:paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
4Bây giờ, hãy để thử nghiệm điều này:
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
5paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
6Bây giờ để thao túng phần kỹ năng của người Viking như chúng tôi muốn ban đầu, trước tiên chúng tôi tìm thấy đoạn văn phù hợp. Vì hai đối tượng
document = Document["resume.docx"]
with open['resume.xml', 'w'] as f:
f.write[document._element.xml]
9 có cùng một đoạn văn, chúng ta cần tìm số lượng đoạn nào chứa văn bản và trong đó hộp văn bản:
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
7Bây giờ để chèn một kỹ năng mới, chúng ta cần tạo một đoạn văn mới với văn bản Microsoft 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 thức
R
esume
7 này với thông tin văn bản và phong cách phù hợp. Đoạn văn trong câu hỏi là từ có từ nghiên cứu từ ngữ. Tôi muốn sao chép phong cách của đoạn này vào đoạn mới, nhưng vì một số lý do, thông tin phong cách trống rỗng cho đoạn này. Tuy nhiên, tôi biết rằng phong cách của đoạn này phải là
R
esume
8, 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"]
8Khi bây giờ mở tài liệu Word, chúng tôi thấy mục Microsoft Microsoft Word trong danh sách các kỹ năng của tôi, với phong cách phù hợp và mọi thứ. Tôi đã lừa dối một chút; Tôi cần thực hiện một số thay đổi kỹ thuật bổ sung cho mã cho tất cả các hoạt động này, nhưng các chi tiết không phải là siêu quan trọng. Nếu bạn muốn sử dụng tính năng này, bạn có thể sử dụng Fork of Python-Docx của tôi. Giải pháp của tôi vẫn còn một chút hacky, 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.
Sự kết luận
Tóm lại, chúng ta có thể sử dụng Python để chỉnh sửa tài liệu từ. Tuy nhiên, gói
paragraph.text = "Willem Hendrik"
document.save["resume_edited.docx"]
9 không hoàn toàn trưởng thành và sử dụng nó để chỉnh sửa các tài liệu từ được cách điệu cao là một chút đau đớn [nhưng có thể!]. Tuy nhiê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 phải làm điều này. Mặt khác, có chức năng khá rộng rãi trong Visual Basic để chỉnh sửa các tài liệu từ và toàn bộ API từ được xây dựng xung quanh Visual Basic.Mặc dù bây giờ tôi có tất cả các công cụ có sẵn để tự động cập nhật CV của mình bằng Python, tôi thực sự sẽ không làm việc đó. Đó là rất nhiều công việc để thiết lập đúng và cần bảo trì tích cực bao giờ hết tôi muốn thay đổi kiểu dáng của CV. Có lẽ đó là một ý tưởng tốt hơn để chỉnh sửa thủ công mỗi khi tôi cần. Tự động hóa isn luôn luôn xứng đáng. Nhưng tôi sẽ rất ngạc nhiên nếu kỹ năng mới tìm thấy này sẽ hữu ích tại một thời điểm nào đó trong tương lai đối với tôi.
Bài viết gần đây
GMRES: Hoặc cách thực hiện đại số tuyến tính nhanh
Ngày 10 tháng 3 năm 2022 24 phút đọc
24
minute read
Hệ thống bình phương nhỏ nhất tuyến tính bật lên ở khắp mọi nơi, và có nhiều cách nhanh chóng để giải quyết chúng. Chúng tôi sẽ nhìn vào một cách như vậy: GMRES.
DeconVolution #2: Tinh thần hình ảnh
Ngày 9 tháng 4 năm 2021 15 phút Đọc
15 minute read
Để tự động làm sắc nét hình ảnh, trước tiên chúng ta cần hiểu làm thế nào một máy tính có thể đánh giá hình ảnh của một hình ảnh tự nhiên như thế nào.