使用Itext和POI java将DOC/DOCX转换为PDF与嵌入的图片、下划线和表格不正确对齐不起作用

使用Itext和POI java将DOC/DOCX转换为PDF与嵌入的图片、下划线和表格不正确对齐不起作用,itext,apache-poi,Itext,Apache Poi,要求是将上传的文件(doc、docx、jpg、png和pdf)转换为pdf,然后将其存储在数据库中。我没有问题将jpg/png/pdf转换为pdf。虽然我能够从doc和docx生成pdf,但对齐不正确,因为嵌入的图片大小与输入文件中的大小不一样,字体、下划线、表格都不起作用。 请帮助我得到正确的嵌入图片(有时我会得到半幅图片),下划线和表格,以正确的PDF格式编写 我看到很少有代码行通过使用下面的JAR在网上实现相同的功能(它负责完整的端到端转换),但是当我们不允许使用这些JAR时。 org.a

要求是将上传的文件(doc、docx、jpg、png和pdf)转换为pdf,然后将其存储在数据库中。我没有问题将jpg/png/pdf转换为pdf。虽然我能够从doc和docx生成pdf,但对齐不正确,因为嵌入的图片大小与输入文件中的大小不一样,字体、下划线、表格都不起作用。 请帮助我得到正确的嵌入图片(有时我会得到半幅图片),下划线和表格,以正确的PDF格式编写

我看到很少有代码行通过使用下面的JAR在网上实现相同的功能(它负责完整的端到端转换),但是当我们不允许使用这些JAR时。
org.apache.poi.xwpf.converter.core-1.0.6.jar
org.apache.poi.xwpf.converter.pdf-1.0.6.jar
fr.opensagres.xdocreport.itext.extension-2.0.0.jar

使用的罐子:
iText 2.1.7
poi:3.12
ooxml:3.12
ooxml模式:3.12
草稿行:3.12
xmlbeans:2.3.0

有人能帮我用所附的代码修复上述问题吗。
public class WordTopdConverter{
公共静态void main(最终字符串[]args){
最后一个字符串worddocLocation=“C:\\Users\\VBUVANES\\Desktop\\Word粘贴图像示例.docx”;
最终字符串pdfLocation=“C:\\Users\\VBUVANES\\Desktop\\GeneratePDF\\testdocxtopdf_result4.pdf”;
最终字符串类型=“docx”;
convertWordToPdf(worddocLocation、pdfLocation、type);
}

public static void convertWordToPdf(final String src, final String desc, final String fileType) {
    try {
        final FileInputStream fs = new FileInputStream(src);
        final XWPFDocument doc = new XWPFDocument(fs);
        final Document pdfdoc = new Document(PageSize.A4, 72, 72, 72, 72);
        final PdfWriter pwriter = PdfWriter.getInstance(pdfdoc,
                new FileOutputStream(desc));
        pwriter.setInitialLeading(20);
        final List<XWPFParagraph> plist = doc.getParagraphs();
        pdfdoc.open();
        for (int i = 0; i < plist.size(); i++) {
            final XWPFParagraph pa = (XWPFParagraph)plist.get(i);
            final List<XWPFRun> runs = pa.getRuns();
            for (int j = 0; j < runs.size(); j++) {
                final XWPFRun run = (XWPFRun) runs.get(j);
                final List<XWPFPicture> piclist = run.getEmbeddedPictures();
                final Iterator<XWPFPicture> iterator = piclist.iterator();
                while (iterator.hasNext()) {
                final XWPFPicture pic = (XWPFPicture) iterator.next();
                    final XWPFPictureData picdata = pic.getPictureData();
                    final byte[] bytepic = picdata.getData();
                    final Image imag = Image.getInstance(bytepic);
                    imag.scaleAbsoluteHeight(40);
                    imag.scaleAbsoluteWidth((imag.getWidth() * 30) / imag.getHeight());
                    pdfdoc.add(imag);
                }
                final int color = getCode(run.getColor());
                Font f = null;
                if (run.isBold() && run.isItalic())
                    f = FontFactory.getFont(FontFactory.TIMES_ROMAN,
                            run.getFontSize(), Font.BOLDITALIC,
                        new Color(color));
                else if (run.isBold())
                    f = FontFactory
                            .getFont(FontFactory.TIMES_ROMAN,
                                    run.getFontSize(), Font.BOLD,
                            new Color(color));
                else if (run.isItalic())
                    f = FontFactory.getFont(FontFactory.TIMES_ROMAN, run
                        .getFontSize(), Font.ITALIC, new Color(
                            color));
                else if (run.isStrike())
                    f = FontFactory.getFont(FontFactory.TIMES_ROMAN,
                            run.getFontSize(), Font.STRIKETHRU,
                        new Color(color));
                else
                    f = FontFactory.getFont(FontFactory.TIMES_ROMAN, run
                        .getFontSize(), Font.NORMAL, new Color(
                            color));
                final String text = run.getText(-1);
                byte[] bs;
                if (text != null) {
                    bs = text.getBytes();
                    final String str = new String(bs, "UTF-8");
                    final Chunk chObj1 = new Chunk(str, f);
                    pdfdoc.add(chObj1);
                }

            }
            pdfdoc.add(new Chunk(Chunk.NEWLINE));
        }
        pdfdoc.close();
    } catch (final Exception e) {
        e.printStackTrace();
    }
}

public static int getCode(final String code) {
    int colorCode;
    if (code != null)
        colorCode = Long.decode("0x" + code).intValue();
    else
        colorCode = Long.decode("0x000000").intValue();
    return colorCode;
}
public static void convertWordToPdf(最终字符串src、最终字符串desc、最终字符串文件类型){
试一试{
最终文件输入流fs=新文件输入流(src);
最终XWPF文件=新XWPF文件(fs);
最终文件pdfdoc=新文件(PageSize.A4,72,72,72,72);
final PdfWriter pwriter=PdfWriter.getInstance(pdfdoc,
新文件输出流(desc));
pwriter.setInitialLeading(20);
最终列表plist=doc.get段落();
pdfdoc.open();
对于(int i=0;i

}

请不要使用iText 2.1.7,它已过时。您将无法获得iText软件的支持,而且该版本的社区支持非常少。我邀请您升级到iText 5.5.11感谢您回复@AmedeeVanGasse。我们没有在中批准的最新iText。因此,我们假设仅使用iText 2.1.7获得管理层批准不是技术问题,与堆栈溢出无关。