2013-04-12 36 views
7

Tôi đã viết một tiện ích cho một nhóm khác đệ quy qua các thư mục và chuyển đổi tài liệu Word được tìm thấy sang PDF bằng cách sử dụng Word Interop với C#.Ngăn các trường tài liệu Word cập nhật khi mở

Sự cố chúng tôi gặp phải là tài liệu được tạo với các trường ngày cập nhật ngày hôm nay trước khi chúng được lưu. Tôi đã tìm thấy một phương pháp để vô hiệu hóa việc cập nhật các trường trước khi in, nhưng tôi cần phải ngăn các trường cập nhật khi mở.

Điều đó có khả thi không? Tôi muốn sửa chữa trong C#, nhưng nếu tôi phải làm một macro Word, tôi có thể.

Trả lời

1

Vâng, tôi không tìm thấy cách để làm điều đó với Interop, nhưng công ty của tôi đã mua Aspose.Words và tôi đã viết một tiện ích để chuyển đổi tài liệu Word thành hình ảnh TIFF. Công cụ Aspose sẽ không cập nhật các trường trừ khi bạn nói rõ. Đây là mẫu mã tôi đã sử dụng với Aspose. Hãy ghi nhớ, tôi đã có một yêu cầu để chuyển đổi tài liệu Word thành hình ảnh TIFF trang duy nhất và tôi mã hóa cứng nhiều tùy chọn vì nó chỉ là một tiện ích cho bản thân mình trong dự án này.

private static bool ConvertWordToTiff(string inputFilePath, string outputFilePath) 
    { 
     try 
     { 
      Document doc = new Document(inputFilePath); 

      for (int i = 0; i < doc.PageCount; i++) 
      { 
       ImageSaveOptions options = new ImageSaveOptions(SaveFormat.Tiff); 
       options.PageIndex = i; 
       options.PageCount = 1; 
       options.TiffCompression = TiffCompression.Lzw; 
       options.Resolution = 200; 
       options.ImageColorMode = ImageColorMode.BlackAndWhite; 

       var extension = Path.GetExtension(outputFilePath); 
       var pageNum = String.Format("-{0:000}", (i+1)); 
       var outputPageFilePath = outputFilePath.Replace(extension, pageNum + extension); 

       doc.Save(outputPageFilePath, options); 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      LogError(ex); 
      return false; 
     } 
    } 
4

Như được mô tả trong mê cung vô tận của Microsoft documentation bạn có thể khóa mã trường. Ví dụ trong VBA nếu tôi có một trường ngày duy nhất trong cơ thể dưới dạng

{DATE \@ "M/d/yyyy h:mm:ss am/pm" \* MERGEFORMAT } 

tôi có thể chạy

ActiveDocument.Fields(1).Locked = True 

Sau đó, nếu tôi thực hiện một sự thay đổi cho tài liệu, tiết kiệm, sau đó tái mở, mã trường sẽ không cập nhật.

Ví dụ sử dụng C# Văn phòng Interop:

Word.Application wordApp = new Word.Application(); 
Word.Document wordDoc = wordApp.ActiveDocument; 
wordDoc.Fields.Locked = 1; //its apparently an int32 rather than a bool 

Bạn có thể đặt mã trong trường hợp DocumentOpen. Tôi giả sử bạn có một add-in mà đăng ký vào sự kiện này. Nếu không, hãy làm rõ, vì đó có thể là một trận chiến. EDIT: Trong thử nghiệm của tôi, khóa các trường theo cách này sẽ khóa chúng trên tất cả StoryRanges, vì vậy không cần phải lấy các trường hiện trường ở đầu trang, chân trang, chú thích cuối trang, hộp văn bản, ..., v.v. đãi.

+0

Tôi đã thử điều này bằng ứng dụng mẫu Word Interop và mẹo đặt mã khóa bên trong sự kiện 'DocumentOpen' dường như không thực hiện thủ thuật. Trường ngày được cập nhật trước khi sự kiện được kích hoạt, có nghĩa là bản sửa lỗi này không giải quyết được sự cố. Tuy nhiên, nếu các trường đã bị khóa trong lần lưu tài liệu đầu tiên, điều đó sẽ giải quyết được vấn đề như bạn mô tả, nhưng thật không may, đó không phải là trường hợp. –

+0

Điều này có thể yêu cầu sử dụng XML sau đó – JohnZaj

0

Tôi nghĩ rằng một câu hỏi mới về SO là thích hợp sau đó, bởi vì điều này sẽ yêu cầu xử lý XML hơn là chỉ Office Interop. Nếu bạn có cả hai loại tệp .doc và .docx để chuyển đổi, bạn có thể yêu cầu hai giải pháp riêng biệt: một cho WordML (định dạng XML Word 2003) và một cho OpenXML (định dạng XML Word 2007/2010/2013), vì bạn không thể mở định dạng tệp cũ và lưu dưới dạng mới mà không cần cập nhật các trường.

Kiểm tra OOXML của trường bị khóa hiển thị cho chúng tôi thisw:fldLock="1" thuộc tính. Điều này có thể được chèn vào bằng cách sử dụng xử lý XML thích hợp đối với tài liệu, chẳng hạn như thông qua OOXML SDK, hoặc thông qua một phép biến đổi XSLT tiêu chuẩn.

Có thể hữu ích: câu hỏi how-do-i-unlock-a-content-control-using-the-openxml-sdk-in-a-word-2010-document này có thể là tình huống tương tự nhưng đối với Kiểm soát nội dung. Bạn có thể áp dụng cùng một giải pháp cho Trường, nếu các loại LockLockingValues áp dụng cùng một cách cho các trường. Tôi không chắc chắn về điều này tuy nhiên.

Để tự tin hơn rằng đây là cách để thực hiện, hãy xem ví dụ về nhà cung cấp này solution về sự cố. Nếu bạn cần phát triển nội bộ này, thì openxmldeveloper.org là một nơi tốt để bắt đầu - hãy tìm các ví dụ của Eric White để thao tác các trường như this.

Các vấn đề liên quan