Java 使用ApachePOI将文档转换为pdf

Java 使用ApachePOI将文档转换为pdf,java,pdf,pdf-generation,apache-poi,doc,Java,Pdf,Pdf Generation,Apache Poi,Doc,我正在尝试使用ApachePOI将文档转换为pdf,但生成的pdf文档只包含文本,没有任何格式,如图像、表格对齐等 如何将文档转换为pdf格式,并具有所有格式,如表格、图像、对齐 这是我的密码: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import com.lowagie.text.Document; im

我正在尝试使用ApachePOI将文档转换为pdf,但生成的pdf文档只包含文本,没有任何格式,如图像、表格对齐等

如何将文档转换为pdf格式,并具有所有格式,如表格、图像、对齐

这是我的密码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;


import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;

import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class demo {
    public static void main(String[] args) {

        POIFSFileSystem fs = null;  
        Document document = new Document();

         try {  
             System.out.println("Starting the test");  
             fs = new POIFSFileSystem(new FileInputStream("Resume.doc"));  

             HWPFDocument doc = new HWPFDocument(fs);  
             WordExtractor we = new WordExtractor(doc);  

             OutputStream file = new FileOutputStream(new File("test.pdf")); 

             PdfWriter writer = PdfWriter.getInstance(document, file);  

             Range range = doc.getRange();
             document.open();  
             writer.setPageEmpty(true);  
             document.newPage();  
             writer.setPageEmpty(true);  

             String[] paragraphs = we.getParagraphText();  
             for (int i = 0; i < paragraphs.length; i++) {  

                 org.apache.poi.hwpf.usermodel.Paragraph pr = range.getParagraph(i);
                 paragraphs[i] = paragraphs[i].replaceAll("\\cM?\r?\n", "");  
                 System.out.println("Length:" + paragraphs[i].length());  
                 System.out.println("Paragraph" + i + ": " + paragraphs[i].toString());  
                 // add the paragraph to the document  
                 document.add(new Paragraph(paragraphs[i]));  
             }  

             System.out.println("Document testing completed");  
         } catch (Exception e) {  
             System.out.println("Exception during test");  
             e.printStackTrace();  
         } finally {  
             // close the document  
             document.close();  
         }  
     }  
 }
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.OutputStream;
导入com.lowagie.text.Document;
导入com.lowagie.text.DocumentException;
导入com.lowagie.text.paragration;
导入com.lowagie.text.pdf.PdfWriter;
导入org.apache.poi.hwpf.hwpf文档;
导入org.apache.poi.hwpf.extractor.WordExtractor;
导入org.apache.poi.hwpf.usermodel.Range;
导入org.apache.poi.poifs.filesystem.poifsfsystem;
公开课演示{
公共静态void main(字符串[]args){
POIFSFS=null;
文档=新文档();
试试{
System.out.println(“开始测试”);
fs=新的POIFSF文件系统(新的FileInputStream(“Resume.doc”);
HWPF文件文件=新的HWPF文件(fs);
WordExtractor we=新的WordExtractor(文档);
OutputStream文件=新文件OutputStream(新文件(“test.pdf”);
PdfWriter writer=PdfWriter.getInstance(文档、文件);
Range Range=doc.getRange();
document.open();
writer.setPageEmpty(true);
document.newPage();
writer.setPageEmpty(true);
String[]段落=we.getParagraphText();
对于(inti=0;i
手头的任务是将文档转换为pdf,包括所有格式,如表格、图像、对齐方式

创建自己的转换器类

ApachePOI中已经有
WordToxxConverter
类,即和。后一个很可能太过有损,无法作为您需求的示例,但前两个已经足够了

所有这些转换器类都派生自公共基类,该基类为字转换类提供了基本框架。此外,所有这些类都使用了一个匹配的
*DocumentFacade
类,该类封装了具体的目标(或某些中间)格式创建:,或

因此,要实现将文档转换为pdf的任务,并具有所有格式,如表、图像、对齐,您还应该从中派生一个转换器类,要实现抽象方法,请从三个具体的实现类中得到启发。与其他转换器类一样,将特定于PDF库的代码集中到
PdfDocumentFacade
类似乎是个好主意

如果您想从简单开始并在以后添加更复杂的细节,那么可以先使用大量实现代码,并且一旦这些代码至少在概念验证级别起作用,就可以扩展该功能以涵盖越来越多的格式信息

不幸的是,这个转换器框架有点以DOM元素为中心:回调期望并转发DOM元素作为当前目标文档上下文的指示符;乍一看,它似乎没有利用作为DOM元素的上下文,因此您可以复制该基类,并将这些DOM元素参数交换为更合适的类型或更好的泛型类参数

将现有的Word-to-XXX转换器与现有的XXX-to-Pdf转换器结合使用

如果这对您的资源来说太复杂或太耗时,您可以尝试另一种方法:您可以尝试使用上面提到的一个现有转换器的输出作为另一个转换为Pdf的输入

使用现有的转换类将更早地产生结果,但多步转换往往比单步转换更有损。决定权在你

在您在问题中发布的代码中,您使用了iText类。iText确实支持使用子项目中提供的
XMLWorker
将HTML转换为PDF,但有一定的限制。在古老的iText版本中,也曾经有现在不推荐的
HTMLWorker
类。因此,将与iText
XMLWorker
结合使用可能是您的一种选择

另外,Apache还提供对PDF的XSL FO处理。应用于输出的选项也可以是选项< /p> 作为POI的替代(但仍然在java域中),您可以考虑DOXX4J(我牵头/维护)。 对于docx文件,docx4j可以通过先转换为FO,然后使用FOP转换为PDF来转换为PDF


对于传统的二进制文档文件(以及docx文件),我们有一个高性能的商业解决方案。您可以在中尝试,或在中获取更多信息。我使用OpenOffice/LibreOffice导出为PDF,它有一些自动化支持,例如

unoconv -vvv --timeout=10 --doctype=document --output=result.pdf result.docx
将文档转换为pdf。

生成的pdf文档只包含文本,它没有任何格式,如图像、表格对齐-您只会得到文本,因为您只需要