Làm cách nào tôi có thể chuyển đổi tệp ODT thành PDF?


Câu trả lời:


68

Chỉ cần mở tài liệu với văn phòng libre và chọn Xuất dưới dạng PDF ... :

nhập mô tả hình ảnh ở đây

Đối với một giải pháp dòng lệnh, có unoconv Cài đặt TÊN chuyển đổi các tệp từ dòng lệnh:

unoconv -f pdf mydocument.odt

Lưu ý: Chỉ bắt đầu từ Ubuntu 11.10 unoconv phụ thuộc vào Libre Office. Các phiên bản unoconv trước đây (từ Ubuntu <= 11.04) phụ thuộc vào Open Office (nhưng nó cũng sẽ chạy với Libre Office).


3
thx để đề cập unoconv, nó thật tuyệt!
Boris Däppen

1
Đối với những người thắc mắc về ưu và nhược điểm của dòng lệnh Unoconv vs Libreoffice, vấn đề này có thể giúp ích: github.com/dagwieers/unoconv/issues/364
Sebastien Lorber

@Takkat unoconv dường như không tìm thấy vị trí libreoffice5 trên MacOS Sierra unoconv: Cannot find a suitable office installation on your system., do đó, nó không thể sử dụng được :(
SebMa

87

Bạn cũng có thể sử dụng dòng lệnh libreofficecho mục đích của mình. Điều đó mang lại cho bạn lợi thế của việc chuyển đổi hàng loạt. Nhưng các tập tin duy nhất cũng có thể. Ví dụ này chuyển đổi tất cả các tệp ODT trong thư mục hiện tại thành PDF:

libreoffice --headless --convert-to pdf *.odt

Nhận thêm thông tin về các tùy chọn dòng lệnh với:

man libreoffice

Một lập luận khác cho việc sử dụng dòng lệnh là ví dụ trong trường hợp của tôi, gui đột nhiên bắt đầu tạo ra các bản pdf bị lỗi, nhưng dòng lệnh vẫn hoạt động như một bùa mê.
Hermann Ingjaldsson

4
Thi9s hoạt động, nhưng nó có một vấn đề: nếu GUI mở, lệnh sẽ không làm gì cả (thậm chí không hiển thị lỗi). Xấu xí, nhưng với cách giải quyết này, bạn có thể mở một ví dụ mới : --env:UserInstallation=file:///path/to/some/directory.
tokland

1
@tokland: Có một báo cáo lỗi cho điều đó: bug.freedesktop.org/show_orms.cgi?id=37531
Ốc cơ khí

1
Tôi quản lý để có được chuyển đổi hàng loạt unoconvlà tốt. Ví dụ tôi đã sử dụng dòng unoconv -f pdf *.pptthành công.
XavierStuvw

2
đối với những người thắc mắc ưu và nhược điểm của dòng lệnh Unoconv vs Libreoffice, vấn đề này có thể giúp ích: github.com/dagwieers/unoconv/issues/364
Sebastien Lorber

8

Dưới đây là một vài chi tiết về phương pháp "không phải GUI".

  1. Bạn không chỉ có thể sử dụng phương pháp này để chuyển đổi tệp ODT sang PDF. Nó cũng sẽ hoạt động đối với các tệp DOCX của MS Word (nó sẽ hoạt động tốt như LibreOffice có thể xử lý ODT cụ thể) và nói chung, tất cả các loại tệp mà LibreOffice có thể mở.

  2. Tôi không nghĩ rằng có một nhị phân được đặt tên libreofficelà một trong những câu trả lời khác được đề xuất. Tuy nhiên, có soffice(.bin)- nhị phân có thể được sử dụng để khởi động LibreScript từ dòng lệnh. Nó thường nằm ở /usr/lib/libreoffice/program/; và rất thường xuyên, một liên kết tượng trưng /usr/bin/sofficeđến vị trí đó.

  3. Sau đó, trong hầu hết các trường hợp, các tham số --headless --convert-to pdflà không đủ. Nó cần phải:

    --headless --convert-to pdf:writer_pdf_Export
    

    Hãy chắc chắn để làm theo chính xác viết hoa này!

  4. Tiếp theo, lệnh sẽ không hoạt động nếu đã có phiên bản GUI LibreScript và chạy trên hệ thống của bạn. Nó được gây ra bởi lỗi # 37531, được biết đến từ năm 2011 . Thêm tham số bổ sung này vào lệnh của bạn:

     "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_${USER}"
    

    Điều này sẽ tạo ra một môi trường mới, riêng biệt có thể được sử dụng bởi một thể hiện LO không đầu thứ hai mà không can thiệp vào một cá thể GUI LO đầu tiên có thể chạy được bắt đầu bởi cùng một người dùng.

  5. Ngoài ra, hãy chắc chắn rằng --outdir /pdfbạn chỉ định tồn tại và bạn có quyền ghi vào nó. Hoặc, thay vì sử dụng một dir đầu ra khác nhau. Ngay cả khi nó chỉ dành cho vòng thử nghiệm và gỡ lỗi đầu tiên:

    $ mkdir ${HOME}/lo_pdfs
    
  6. Vì thế:

    /path/to/soffice                                                     \
      --headless                                                         \
      "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_${USER}" \
      --convert-to pdf:writer_pdf_Export                                 \
      --outdir ${HOME}/lo_pdfs                                           \
    /path/to/test.docx
    

    Điều này hoạt động với tôi trên Mac OS X Yosemite 10.10.5 với LibreOffice v5.1.2.2 (sử dụng đường dẫn cụ thể của tôi cho tệp nhị phân sofficesẽ khác với Ubuntu ...). Nó cũng hoạt động trên Debian Jessie 8.0 (sử dụng đường dẫn /usr/lib/libreoffice/program/soffice). Xin lỗi, không thể kiểm tra nó trên Ubuntu ngay bây giờ ....

    Nếu tất cả điều này không hoạt động, khi bạn cố gắng xử lý DOCX:

  7. Nó có thể là một vấn đề với tệp DOCX cụ thể mà bạn thử lệnh với ... Vì vậy, trước tiên hãy tạo một tài liệu DOCX rất đơn giản của riêng bạn. Sử dụng LibreScript chính nó cho việc này. Viết "Xin chào thế giới!" trên một trang trống. Lưu nó dưới dạng DOCX.

  8. Thử lại. Nó có hoạt động với DOCX đơn giản không?

  9. Nếu nó không hoạt động trở lại, hãy lặp lại bước 7, nhưng lưu dưới dạng ODT lần này.

  10. Lặp lại bước 8, nhưng đảm bảo tham chiếu ODT lần này.

  11. Lần cuối: Sử dụng đường dẫn đầy đủ đến soffice, soffice.binđến libreofficevà chạy và chạy với từng -htham số:

    $ /path/to/libreoffice -h  # if that path exists, which I doubt!
    $ /path/to/soffice -h
    $ /path/to/soffice.bin -h
    
    • Bạn có nhận được một đầu ra ở đây?
    • Cho một trong ba nhị phân / symlink?
    • Ghi lại kết quả đầu ra.
    • Hãy cho chúng tôi đầu ra của bạn !!!
       

    So sánh chúng với dòng lệnh bạn đã sử dụng:

    • Có bất kỳ thay đổi nào trong tên tham số, viết hoa, số dấu gạch ngang được sử dụng, v.v. ??
       

    Để so sánh, đầu ra (Mac OS X) của riêng tôi ở đây:

     $ /Applications/LibreOffice.app/Contents/MacOS/soffice -h 
    
     LibreOffice 5.1.2.2 d3bf12ecb743fc0d20e0be0c58ca359301eb705f
    
     Usage: soffice [options] [documents...]
    
     Options:
     --minimized    keep startup bitmap minimized.
     --invisible    no startup screen, no default document and no UI.
     --norestore    suppress restart/restore after fatal errors.
     --quickstart   starts the quickstart service
     --nologo       don't show startup screen.
     --nolockcheck  don't check for remote instances using the installation
     --nodefault    don't start with an empty document
     --headless     like invisible but no user interaction at all.
     --help/-h/-?   show this message and exit.
     --version      display the version information.
     --writer       create new text document.
     --calc         create new spreadsheet document.
     --draw         create new drawing.
     --impress      create new presentation.
     --base         create new database.
     --math         create new formula.
     --global       create new global document.
     --web          create new HTML document.
     -o             open documents regardless whether they are templates or not.
     -n             always open documents as new files (use as template).
    
     --display <display>
           Specify X-Display to use in Unix/X11 versions.
     -p <documents...>
           print the specified documents on the default printer.
     --pt <printer> <documents...>
           print the specified documents on the specified printer.
     --view <documents...>
           open the specified documents in viewer-(readonly-)mode.
     --show <presentation>
           open the specified presentation and start it immediately
     --accept=<accept-string>
           Specify an UNO connect-string to create an UNO acceptor through which
           other programs can connect to access the API
     --unaccept=<accept-string>
           Close an acceptor that was created with --accept=<accept-string>
           Use --unnaccept=all to close all open acceptors
     --infilter=<filter>[:filter_options]
           Force an input filter type if possible
           Eg. --infilter="Calc Office Open XML"
               --infilter="Text (encoded):UTF8,LF,,,"
     --convert-to output_file_extension[:output_filter_name[:output_filter_options]] [--outdir output_dir] files
           Batch convert files (implies --headless).
           If --outdir is not specified then current working dir is used as output_dir.
           Eg. --convert-to pdf *.doc
               --convert-to pdf:writer_pdf_Export --outdir /home/user *.doc
               --convert-to "html:XHTML Writer File:UTF8" *.doc
               --convert-to "txt:Text (encoded):UTF8" *.doc
     --print-to-file [-printer-name printer_name] [--outdir output_dir] files
           Batch print files to file.
           If --outdir is not specified then current working dir is used as output_dir.
           Eg. --print-to-file *.doc
               --print-to-file --printer-name nasty_lowres_printer --outdir /home/user *.doc
     --cat files
           Dump text content of the files to console
           Eg. --cat *.odt
     --pidfile=file
           Store soffice.bin pid to file.
     -env:<VAR>[=<VALUE>]
           Set a bootstrap variable.
           Eg. -env:UserInstallation=file:///tmp/test to set a non-default user profile path.
    
     Remaining arguments will be treated as filenames or URLs of documents to open.
    
  12. Thêm một đối số nữa vào dòng lệnh của bạn để thực thi ứng dụng của bộ lọc đầu vào khi sofficemở tệp DOCX của bạn:

    --infilter="Microsoft Word 2007/2010/2013 XML"
    

    hoặc là

    --infilter="Microsoft Word 2007/2010/2013 XML"
    --infilter="Microsoft Word 2007-2013 XML"
    --infilter="Microsoft Word 2007-2013 XML Template"
    --infilter="Microsoft Word 95 Template"
    --infilter="MS Word 95 Vorlage"
    --infilter="Microsoft Word 97/2000/XP Template"
    --infilter="MS Word 97 Vorlage"
    --infilter="Microsoft Word 2003 XML"
    --infilter="MS Word 2003 XML"
    --infilter="Microsoft Word 2007 XML Template"
    --infilter="MS Word 2007 XML Template"
    --infilter="Microsoft Word 6.0"
    --infilter="MS WinWord 6.0"
    --infilter="Microsoft Word 95"
    --infilter="MS Word 95"
    --infilter="Microsoft Word 97/2000/XP"
    --infilter="MS Word 97"
    --infilter="Microsoft Word 2007 XML"
    --infilter="MS Word 2007 XML"
    --infilter="Microsoft WinWord 5"
    --infilter="MS WinWord 5"
    

fwiw, lỗi tdf 37531 đã được đánh dấu là đã giải quyết / đã sửa
myrdd

4

Tập lệnh Nautilus

Tập lệnh này sử dụng libreoffice để chuyển đổi các tệp tương thích với LibreScript thành PDF.

#!/bin/bash
## PDFconvert 0.1
## by Glutanimate (https://askubuntu.com/users/81372/)
## License: GPL 3.0
## depends on python, libreoffice
## Note: if you are using a non-default LO version (e.g. because you installed it 
## from a precompiled package instead of the official repos) you might have to change
## 'libreoffice' according to the version you're using, e.g. 'libreoffice3.6'

# Get work directory
base="`python -c 'import gio,sys; print(gio.File(sys.argv[1]).get_path())' $NAUTILUS_SCRIPT_CURRENT_URI`"

#Convert documents
while [ $# -gt 0 ]; do
    document=$1
    libreoffice --headless --invisible --convert-to pdf --outdir "$base" "$document" 
    shift

done

Để biết hướng dẫn cài đặt, xem tại đây: Làm cách nào tôi có thể cài đặt tập lệnh Nautilus?


2
Tôi chỉ hy vọng rằng chức năng như "lipreoffice" cũng sẽ có trong OSX. Đôi khi, tôi cảm thấy tay mình quá ngắn khi phải sử dụng máy Mac.
Léo Léopold Hertz 준영

2

Lưu ý: Tôi đã quyết định xóa câu trả lời của mình khỏi câu hỏi này và đăng một phiên bản sửa đổi của nó ở đây khi tôi nhận ra rằng unoconvnó không xử lý tốt pswcác tệp và không chuyển đổi chúng thành các định dạng khác. Cũng có thể có vấn đề với docxxlsxđịnh dạng.


Tuy nhiên, Libreofficehỗ trợ đầy đủ nhiều loại tệp; tài liệu đầy đủ có sẵn tại trang web chính thức, trong đó nêu chi tiết các định dạng đầu vào và đầu ra hợp lệ.

Bạn có thể sử dụng libreofficetiện ích chuyển đổi dòng lệnh hoặc unoconv , có sẵn trong kho. Tôi thấy unoconvrất hữu ích, và nó có lẽ là những gì bạn muốn. Mặc dù Takkat đã đề cập ngắn gọn unoconv, tôi nghĩ rằng nó sẽ hữu ích để cung cấp thêm một số chi tiết và một lớp chuyển đổi hàng loạt.

Sử dụng thiết bị đầu cuối, bạn có thể cdvào thư mục chứa các tệp của mình và sau đó chuyển đổi hàng loạt tất cả chúng bằng cách chạy một lớp lót như thế này:

for f in *.odt; do unoconv -f pdf "${f/%pdf/odt}"; done

(Phần một này là bản sửa đổi tập lệnh dịch của tôi được nêu trong câu trả lời này .)

Nếu sau này bạn muốn sử dụng bất kỳ định dạng tệp nào khác, chỉ cần thay thế odtpdfcho bất kỳ định dạng đầu vào và đầu ra được hỗ trợ nào khác. Bạn có thể tìm thấy các định dạng được hỗ trợ cho một loại tệp bằng cách nhập unoconv -f odt --show. Để chuyển đổi một tập tin sử dụng, ví dụ , unoconv -f pdf myfile.odt.

Thông tin thêm về và các tùy chọn cho chương trình có thể được tìm thấy bằng cách nhập vào thiết bị đầu cuối man unoconvhoặc bằng cách truy cập các trang web Ubuntu trực tuyến .


1

Một tập lệnh Nautilus khác

Tập lệnh Nautilus rất đơn giản và nhẹ này sử dụng unoconvđể chuyển đổi (các) tệp đã chọn tương thích với định dạng LibreOffice sang định dạng PDF:

#!/bin/sh
#Nautilus Script to convert selected LibreOffice-compatible file(s) to PDF
#
OLDIFS=$IFS
IFS="
"
for filename in $@; do
unoconv --doctype=document --format=pdf "$filename"
done
IFS=$OLDIFS

1

Tôi đang thêm một câu trả lời mới, bởi vì trong thời gian gần đây, một loạt các đường dẫn chuyển đổi mới đã được Pandoc mở ra để có được khả năng đọc các tệp ODT.

Khi Pandoc đọc theo định dạng tệp, nó chuyển đổi nó thành định dạng bên trong, "bản địa" (là một dạng của JSON).

Từ dạng nguyên gốc của nó, sau đó nó có thể xuất tài liệu thành một loạt các định dạng khác. Không chỉ PDF, mà cả DocBook, HTML, EPUB, DOCX, ASCIIdoc, DokuWiki, MediaWiki và những gì không ...

Vì ở đây định dạng đầu ra mong muốn là PDF, chúng tôi có một lựa chọn khác về các đường dẫn khác nhau, được cung cấp bởi những gì Pandoc đang gọi là một công cụ pdf . Dưới đây là danh sách các công cụ PDF hiện có (hợp lệ cho Pandoc v2.7.2 trở lên - các phiên bản trước chỉ có thể hỗ trợ một danh sách nhỏ hơn):

  • pdflatex: Điều này đòi hỏi LaTeX phải được cài đặt ngoài Pandoc.

  • xelatex: Điều này đòi hỏi XeLaTeX phải được cài đặt ngoài Pandoc (cũng có sẵn dưới dạng gói bổ sung cho các bản phân phối TeX chung ).

  • bối cảnh: Điều này đòi hỏi ConTeXt phải được cài đặt ngoài Pandoc; ConTeXt có sẵn dưới dạng gói bổ sung cho hầu hết các bản phân phối TeX chung ).

  • lualatex: Điều này đòi hỏi LuaTeX phải được cài đặt ngoài Pandoc (cũng có sẵn dưới dạng gói bổ sung cho các bản phân phối TeX chung ).

  • pdfroff: Điều này đòi hỏi GNU Roff phải được cài đặt cùng với Pandoc.

  • wkhtml2pdf: Điều này yêu cầu wkhtmltopdf phải được cài đặt ngoài Pandoc.

  • hoàng tử: Điều này đòi hỏi PrinceXML phải được cài đặt ngoài Pandoc.

  • weasyprint: Điều này đòi hỏi weasyprint phải được cài đặt ngoài Pandoc.

Có một số công cụ PDF mới hơn và mới hơn hiện được tích hợp vào Pandoc, mà tôi chưa sử dụng cho mình và hiện tại tôi không thể mô tả chi tiết hơn: kiến tạolatexmk .

CẢNH BÁO: Đừng hy vọng rằng sự xuất hiện của tài liệu gốc của bạn sẽ giống hệt nhau trong tất cả các đầu ra PDF với bản xem trước in hoặc xuất PDF của ODT! Pandoc, khi chuyển đổi không bảo tồn bố cục , nó bảo tồn nội dungcấu trúc của tài liệu: đoạn văn vẫn là đoạn văn, từ được nhấn mạnh vẫn được nhấn mạnh, tiêu đề vẫn là tiêu đề, v.v. Nhưng nhìn tổng thể có thể thay đổi đáng kể.

Lệnh ví dụ

pdflatex:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=pdflatex

XeLaTeX:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=xelatex

LuaLaTeX:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=lualatex

Bối cảnh:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=context

Troff GNU:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=pdfroff

wkhtmltopdf:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=wkhtml2pdf

Hoàng tửXML:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=prince

dấu vết:

 pandoc -f odt -o mydoc.pdf mydoc.odt --pdf-engine=weasyprint

Các lệnh trên là cơ bản nhất cho việc chuyển đổi. Tùy thuộc vào công cụ PDF bạn chọn, có thể có nhiều tùy chọn khác có thể để kiểm soát sự xuất hiện của tệp PDF đầu ra. Ví dụ: các tham số bổ sung sau có thể được thêm vào tất cả các đường dẫn định tuyến thông qua LaTeX:

 -V geometry:"paperwidth=23.3cm, paperheight=1000pt, margin=11.2mm, top=2cm"

sẽ sử dụng kích thước trang tùy chỉnh (lớn hơn một chút so với DIN A4) với lề 2cm ở cạnh trên và 1,12cm ở ba cạnh còn lại).


Vui lòng kiểm tra para thứ tư từ đầu. Nó xuất hiện không đầy đủ.
DK Bose

@DKBose: Thx, xong.
Kurt Pfeifle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.