ฉันจะแปลงไฟล์ ODT เป็น PDF ได้อย่างไร


คำตอบ:


68

เพียงเปิดเอกสารที่มี libre office แล้วเลือกส่งออกเป็น PDF ... :

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับโซลูชันบรรทัดคำสั่งมีunoconv ติดตั้ง NAMEที่แปลงไฟล์จากบรรทัดคำสั่ง:

unoconv -f pdf mydocument.odt

หมายเหตุ:เฉพาะการเริ่มต้นจาก Ubuntu 11.10 unoconv ขึ้นอยู่กับ Libre Office เวอร์ชัน unoconv ก่อนหน้า (จาก Ubuntu <= 11.04) ขึ้นอยู่กับ Open Office (แต่จะทำงานด้วย Libre Office)


3
ขอบคุณที่พูดถึงunoconvมันเยี่ยมมาก!
Boris Däppen

1
สำหรับผู้ที่สงสัยในข้อดีและข้อเสียของบรรทัดคำสั่ง Unoconv vs Libreoffice ปัญหานี้อาจช่วยได้: github.com/dagwieers/unoconv/issues/364
Sebastien Lorber

@Takkat unoconv ดูเหมือนจะไม่พบตำแหน่ง libreoffice5 บน MacOS Sierra มันบอกว่าunoconv: Cannot find a suitable office installation on your system.ดังนั้นจึงใช้ไม่ได้ :(
SebMa

87

คุณยังสามารถใช้บรรทัดคำสั่งของlibreofficeเพื่อวัตถุประสงค์ของคุณ ที่ให้ประโยชน์จากการแปลงแบทช์ แต่ไฟล์เดียวก็เป็นไปได้ ตัวอย่างนี้แปลงไฟล์ ODT ทั้งหมดในไดเรกทอรีปัจจุบันเป็น PDF:

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

รับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกบรรทัดคำสั่งด้วย:

man libreoffice

อีกเหตุผลสำหรับการใช้บรรทัดคำสั่งคือในกรณีของฉัน gui มีทั้งหมดในทันทีที่เริ่มสร้างข้อบกพร่องของ pdf แต่บรรทัดคำสั่งยังคงทำงานเหมือนมีเสน่ห์
Hermann Ingjaldsson

4
Thi9s ใช้งานได้ แต่มีปัญหา: หาก GUI เปิดอยู่คำสั่งจะไม่ทำอะไรเลย (ไม่แสดงข้อผิดพลาด) น่าเกลียด --env:UserInstallation=file:///path/to/some/directoryแต่มีวิธีแก้ปัญหานี้คุณสามารถเปิดตัวอย่างใหม่:
tokland

1
@ โตโก: มีรายงานข้อผิดพลาดสำหรับที่: bugs.freedesktop.org/show_bug.cgi?id=37531
หอยทากเครื่องกล

1
ฉันจัดการเพื่อรับการแปลงชุดด้วยunoconvเช่นกัน ตัวอย่างเช่นฉันใช้สายunoconv -f pdf *.pptสำเร็จ
XavierStuvw

2
สำหรับผู้ที่สงสัยในข้อดีและข้อเสียของบรรทัดคำสั่ง Unoconv vs Libreoffice ปัญหานี้อาจช่วยได้: github.com/dagwieers/unoconv/issues/364
Sebastien Lorber

8

ต่อไปนี้เป็นรายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับวิธีการ "ไม่ใช่ GUI"

  1. คุณสามารถใช้วิธีนี้ไม่เพียง แต่จะแปลงไฟล์ ODT เป็น PDF มันจะทำงานกับไฟล์ MS Word DOCX (มันจะทำงานเช่นเดียวกับ LibreOffice สามารถจัดการ ODT โดยเฉพาะ) และโดยทั่วไปทุกประเภทไฟล์ที่ LibreOffice สามารถเปิดได้

  2. ฉันไม่คิดว่ามีชื่อไบนารีlibreofficeเป็นหนึ่งในคำตอบอื่น ๆ ที่แนะนำ อย่างไรก็ตามมีsoffice(.bin)- ไบนารีที่สามารถใช้เพื่อเริ่ม LibreOffice จากบรรทัดคำสั่ง มันมักจะอยู่ใน/usr/lib/libreoffice/program/; และบ่อยครั้งที่ symlink /usr/bin/sofficeชี้ไปยังตำแหน่งนั้น

  3. จากนั้นในกรณีส่วนใหญ่พารามิเตอร์--headless --convert-to pdfไม่เพียงพอ มันจะต้องเป็น:

    --headless --convert-to pdf:writer_pdf_Export
    

    อย่าลืมทำตามตัวพิมพ์ใหญ่ให้แน่ชัด!

  4. ถัดไปคำสั่งจะไม่ทำงานหากมีอินสแตนซ์ LibreOffice GUI อยู่แล้วและทำงานบนระบบของคุณ มันเกิดจากข้อผิดพลาด# 37531 หรือที่รู้จักกันตั้งแต่ 2011 เพิ่มพารามิเตอร์เพิ่มเติมนี้ในคำสั่งของคุณ:

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

    สิ่งนี้จะสร้างสภาพแวดล้อมใหม่แยกจากกันซึ่งสามารถใช้งานโดยอินสแตนซ์ LO ที่สองและไม่มีส่วนหัวโดยไม่รบกวนการทำงานของอินสแตนซ์ GUI LO แรกที่เริ่มต้นโดยผู้ใช้รายเดียวกัน

  5. ตรวจสอบให้แน่ใจว่า--outdir /pdfคุณระบุมีอยู่และคุณมีสิทธิ์ในการเขียน หรือค่อนข้างใช้เอาท์พุทที่แตกต่างกัน แม้ว่าจะเป็นเพียงการทดสอบครั้งแรกและการดีบัก

    $ mkdir ${HOME}/lo_pdfs
    
  6. ดังนั้น:

    /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
    

    สิ่งนี้ใช้ได้กับฉันใน Mac OS X Yosemite 10.10.5 กับ LibreOffice v5.1.2.2 (โดยใช้เส้นทางเฉพาะของฉันสำหรับไบนารีsofficeซึ่งจะแตกต่างบน Ubuntu ต่อไป ... ) มันยังใช้งานได้กับ Debian Jessie 8.0 (โดยใช้ path /usr/lib/libreoffice/program/soffice) ขออภัยไม่สามารถทดสอบบน Ubuntu ได้ในขณะนี้ ....

    หากสิ่งนี้ไม่ทำงานเมื่อคุณพยายามประมวลผล DOCX:

  7. อาจเป็นปัญหากับไฟล์ DOCX เฉพาะที่คุณลองใช้คำสั่งด้วย ... ดังนั้นให้สร้างเอกสาร DOCX แบบง่าย ๆ ของคุณเองก่อน ใช้ LibreOffice เพื่อสิ่งนี้ เขียน "Hello World!" ในหน้าว่างอย่างอื่น บันทึกเป็น DOCX

  8. ลองอีกครั้ง. ใช้งานกับ DOCX แบบง่าย ๆ ได้หรือไม่

  9. หากไม่สามารถใช้งานได้อีกให้ทำซ้ำขั้นตอนที่ 7 แต่ให้บันทึกเป็น ODT ในเวลานี้

  10. ทำซ้ำขั้นตอนที่ 8 แต่อย่าลืมอ้างอิง ODT ในครั้งนี้

  11. สุดท้าย: ใช้พา ธ เต็มไปsofficeยังsoffice.binไปยังlibreofficeและและเรียกใช้แต่ละรายการด้วย-hพารามิเตอร์:

    $ /path/to/libreoffice -h  # if that path exists, which I doubt!
    $ /path/to/soffice -h
    $ /path/to/soffice.bin -h
    
    • คุณได้รับผลลัพธ์ที่นี่หรือไม่
    • หนึ่งในสามไบนารี / symlink ใด
    • บันทึกผลลัพธ์
    • บอกให้เราทราบผลลัพธ์ของคุณ !!!
       

    เปรียบเทียบกับบรรทัดคำสั่งที่คุณใช้:

    • มีการเปลี่ยนแปลงใด ๆ ในชื่อพารามิเตอร์, การใช้อักษรตัวใหญ่, จำนวนขีดกลางที่ใช้ ฯลฯ ?
       

    สำหรับการเปรียบเทียบผลลัพธ์ของฉัน (Mac OS X) อยู่ที่นี่:

     $ /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. เพิ่มอาร์กิวเมนต์อีกหนึ่งบรรทัดในบรรทัดคำสั่งของคุณเพื่อบังคับใช้แอปพลิเคชันของตัวกรองอินพุตเมื่อsofficeเปิดไฟล์ DOCX ของคุณ:

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

    หรือ

    --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, ข้อผิดพลาด tdf 37531ได้รับการทำเครื่องหมายว่าแก้ไข / แก้ไขแล้ว
myrdd

4

สคริปต์ Nautilus

สคริปต์นี้ใช้ libreOffice เพื่อแปลงไฟล์ที่เข้ากันได้กับ LibreOffice เป็น 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

สำหรับคำแนะนำในการติดตั้งดูที่นี่: ฉันจะติดตั้งสคริปต์ Nautilus ได้อย่างไร


2
ฉันแค่หวังว่าฟังก์ชั่นเช่น "lipreoffice" จะอยู่ใน OSX ด้วย บางครั้งฉันรู้สึกว่ามือของฉันสั้นมากเมื่อฉันต้องใช้ Mac
LéoLéopold Hertz 준영

2

หมายเหตุ: ผมตัดสินใจที่จะลบคำตอบของฉันจากคำถามนี้และจะโพสต์ฉบับแก้ไขได้ที่นี่เมื่อฉันตระหนักว่าunoconvไม่ได้จัดการกับpswไฟล์ที่ทุกคนดีและไม่แปลงพวกเขาประสบความสำเร็จในรูปแบบอื่น ๆ อาจมีปัญหากับdocxและxlsxรูปแบบ


อย่างไรก็ตามLibreofficeรองรับไฟล์หลายประเภทอย่างสมบูรณ์ เอกสารฉบับเต็มมีอยู่ในเว็บไซต์อย่างเป็นทางการซึ่งมีรายละเอียดรูปแบบอินพุตและเอาต์พุตที่ถูกต้อง

คุณสามารถใช้libreofficeยูทิลิตี้แปลงบรรทัดคำสั่งหรือunoconvซึ่งมีอยู่ในที่เก็บ ฉันพบว่าunoconvมีประโยชน์มากและอาจเป็นสิ่งที่คุณต้องการ แม้ว่าTakkatได้กล่าวไว้สั้น ๆunoconvแต่ฉันคิดว่ามันจะมีประโยชน์ในการให้รายละเอียดเพิ่มเติมและการแปลงแบตช์หนึ่งซับ

การใช้เทอร์มินัลคุณสามารถcdไปที่ไดเรกทอรีที่มีไฟล์ของคุณจากนั้นแบตช์จะแปลงไฟล์ทั้งหมดด้วยการรันหนึ่งซับไลน์เช่นนี้:

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

(หนึ่งบรรทัดนี้เป็นการดัดแปลงสคริปต์แปลของฉันที่แสดงในคำตอบนี้)

หากภายหลังคุณต้องการใช้รูปแบบไฟล์อื่นให้แทนที่odtและpdfสำหรับรูปแบบอินพุตและเอาต์พุตอื่นที่สนับสนุน unoconv -f odt --showคุณสามารถหารูปแบบการสนับสนุนสำหรับชนิดแฟ้มโดยการป้อน unoconv -f pdf myfile.odtการแปลงการใช้งานไฟล์เดียวตัวอย่างเช่น

ข้อมูลเพิ่มเติมเกี่ยวกับและตัวเลือกสำหรับโปรแกรมที่สามารถพบได้โดยการป้อนใน terminal man unoconvหรือโดยไปที่manpages อูบุนตูออนไลน์


1

สคริปต์ Nautilus อีกอัน

Nautilus Script ที่เรียบง่ายและน้ำหนักเบานี้ใช้unoconvเพื่อแปลงไฟล์ที่เลือกซึ่งเข้ากันได้กับ LibreOffice เป็นรูปแบบ 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

ฉันกำลังเพิ่มคำตอบใหม่เพราะเมื่อไม่นานมานี้ชุดของเส้นทางการแปลงใหม่เปิดขึ้นโดยPandocได้รับความสามารถในการอ่านไฟล์ ODT

เมื่อ Pandoc อ่านในรูปแบบไฟล์มันจะแปลงเป็นรูปแบบภายใน "ดั้งเดิม" (ซึ่งเป็นรูปแบบของ JSON)

จากรูปแบบเนทิฟมันสามารถส่งออกเอกสารไปเป็นรูปแบบอื่น ๆ ทั้งหมด ไม่เพียง แต่เป็น PDF เท่านั้น แต่ยังรวมถึง DocBook, HTML, EPUB, DOCX, ASCIIdoc, DokuWiki, MediaWiki และอะไร ...

เนื่องจากที่นี่เป็นรูปแบบการส่งออกที่ต้องการเป็นไฟล์ PDF, เรามีทางเลือกของเส้นทางที่แตกต่างให้กับสิ่งที่ Pandoc จะเรียกอีกแบบ pdf เครื่องยนต์ นี่คือรายการของเอ็นจิน PDF ที่มีอยู่ในปัจจุบัน (ใช้ได้กับ Pandoc v2.7.2 และใหม่กว่า - เวอร์ชันก่อนหน้านี้อาจรองรับเฉพาะรายการขนาดเล็กกว่า):

  • pdflatex:ต้องใช้LaTeXเพื่อติดตั้งนอกเหนือจาก Pandoc

  • xelatex:นี้ต้องXeLaTeXจะติดตั้งในนอกจาก Pandoc (ยังมีเป็นแพคเกจเพิ่มเติมเพื่อทั่วไปกระจายเท็กซ์ )

  • บริบท:สิ่งนี้ต้องการConTeXtที่จะติดตั้งนอกเหนือจาก Pandoc; ConTeXt มีให้เป็นแพ็คเกจเพิ่มเติมสำหรับการแจกแจงแบบ TeXทั่วไปส่วนใหญ่)

  • lualatex:นี้ต้องLuaTeXจะติดตั้งในนอกจาก Pandoc (ยังมีเป็นแพคเกจเพิ่มเติมเพื่อทั่วไปกระจายเท็กซ์ )

  • pdfroff:สิ่งนี้ต้องการGNU Roffที่จะติดตั้งเพิ่มเติมจาก Pandoc

  • wkhtml2pdf:นี้ต้องwkhtmltopdfจะติดตั้งในนอกจาก Pandoc

  • prince:ต้องมีการติดตั้งPrinceXMLเพิ่มเติมจาก Pandoc

  • weasyprint:นี้ต้องweasyprintจะติดตั้งในนอกจาก Pandoc

: มีบางมากขึ้นและเครื่องมือใหม่รูปแบบไฟล์ PDF ในขณะนี้รวมอยู่ใน Pandoc ซึ่งผมยังไม่ได้นำมาใช้กับตัวเองและที่ฉันยังไม่สามารถอธิบายในรายละเอียดมากขึ้นเปลือกโลกและlatexmk

คำเตือน:อย่าคาดหวังว่าการปรากฏตัวของเอกสารต้นฉบับของคุณจะเหมือนกันในผลลัพธ์ PDF ทั้งหมดไปยังตัวอย่างก่อนพิมพ์หรือการส่งออก PDF ของ ODT! Pandoc เมื่อการแปลงไม่รักษาเค้าโครงมันจะรักษาเนื้อหาและโครงสร้างของเอกสาร: ย่อหน้ายังคงอยู่ในย่อหน้าย่อหน้าที่เน้นคำยังคงเน้นอยู่ส่วนหัวยังคงเป็นหัวเรื่อง ฯลฯ แต่ลักษณะโดยรวมสามารถเปลี่ยนแปลงได้อย่างมาก

ตัวอย่างคำสั่ง

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

บริบท:

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

tru GNU:

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

wkhtmltopdf:

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

PrinceXML:

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

weasyprint:

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

คำสั่งข้างต้นเป็นพื้นฐานที่สุดสำหรับการแปลง ขึ้นอยู่กับเอ็นจิ้น PDF ที่คุณเลือกอาจมีตัวเลือกอื่น ๆ อีกมากมายที่สามารถควบคุมลักษณะที่ปรากฏของไฟล์ PDF เอาต์พุต ตัวอย่างเช่นอาจมีการเพิ่มพารามิเตอร์เพิ่มเติมต่อไปนี้ในเส้นทางทั้งหมดที่กำหนดเส้นทางผ่าน LaTeX:

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

ซึ่งจะใช้ขนาดหน้าที่กำหนดเอง (ใหญ่กว่า DIN A4 เล็กน้อย) โดยมีระยะขอบ 2 ซม. ที่ขอบด้านบนและ 1.12 ซม. ที่อีกสามขอบ


โปรดตรวจสอบย่อหน้าที่สี่จากด้านบน ดูเหมือนว่าไม่สมบูรณ์
DK Bose

@DKBose: ขอบคุณเสร็จแล้ว
Kurt Pfeifle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.