Преобразование слова (.docx) в pdf с использованием Apache POI и itext - PullRequest
0 голосов
/ 03 октября 2018

В моем веб-приложении на Java у меня есть персидский шаблонное слово (docx) в качестве контракта, которое настраивает его для моих пользователей с их данными, используя APACHE-POI , и после этого янеобходимо преобразовать его в pdf, чтобы оператор не искажал файл.Я пытался преобразовать его, используя itext , но я не смог добиться успеха и не смог найти что-то полезное, кто-то может предложить способ сделать преобразование с использованием itext или кто-нибудь может сказать мне, если есть какой-либо другой способ предотвратить файлот искажения без выполнения конвертации?

Редактировать заметку: я выполнил конвертацию с приведенными ниже кодами, но теперь у меня есть много вопросительных знаков в моем PDF-файле, может кто-нибудь помочь? действительно ли itext поддерживает персидские или RTL языкиКак я могу решить эту проблему?Я использую iText версии 5.0.6 !!

convertWordToPdf("D:/PrivateBanking/docxCo.docx","D:/PrivateBanking/docxCo.pdf");

public static void convertWordToPdf(String src, String desc){
        try{
            //create file inputstream object to read data from file
            FileInputStream fs=new FileInputStream(src);
            //create document object to wrap the file inputstream object
            XWPFDocument doc=new XWPFDocument(fs);
            //72 units=1 inch
            Document pdfdoc=new Document(PageSize.A4,72,72,72,72);
            //create a pdf writer object to write text to mypdf.pdf file
            PdfWriter pwriter=PdfWriter.getInstance(pdfdoc, new FileOutputStream(desc));
            //specify the vertical space between the lines of text
            pwriter.setInitialLeading(20);
            //get all paragraphs from word docx
            List<XWPFParagraph> plist=doc.getParagraphs();

            //open pdf document for writing
            pdfdoc.open();
            for (int i = 0; i < plist.size(); i++) {
                //read through the list of paragraphs
                XWPFParagraph pa = plist.get(i);
                //get all run objects from each paragraph
                List<XWPFRun> runs = pa.getRuns();
                //read through the run objects
                for (int j = 0; j < runs.size(); j++) {
                    XWPFRun run=runs.get(j);
                    //get pictures from the run and add them to the pdf document
                    List<XWPFPicture> piclist=run.getEmbeddedPictures();
                    //traverse through the list and write each image to a file
                    Iterator<XWPFPicture> iterator=piclist.iterator();
                    while(iterator.hasNext()){
                        XWPFPicture pic=iterator.next();
                        XWPFPictureData picdata=pic.getPictureData();
                        byte[] bytepic=picdata.getData();
                        Image imag=Image.getInstance(bytepic);
                        pdfdoc.add(imag);

                    }
                    //get color code
                    int color=getCode(run.getColor());
                    //construct font object
                    Font f=null;
                    if(run.isBold() && run.isItalic())
                        f= FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.BOLDITALIC, new BaseColor(color));
                    else if(run.isBold())
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.BOLD, new BaseColor(color));
                    else if(run.isItalic())
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.ITALIC, new BaseColor(color));
                    else if(run.isStrike())
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.STRIKETHRU, new BaseColor(color));
                    else
                        f=FontFactory.getFont(FontFactory.TIMES_ROMAN,run.getFontSize(),Font.NORMAL, new BaseColor(color));
                    //construct unicode string
                    String text=run.getText(-1);
                    byte[] bs;
                    if (text!=null){
                        bs=text.getBytes();
                        String str=new String(bs,"UTF-8");
                        //add string to the pdf document
                        Chunk chObj1=new Chunk(str,f);
                        pdfdoc.add(chObj1);
                    }

                }
                //output new line
                pdfdoc.add(new Chunk(Chunk.NEWLINE));
            }
            //close pdf document
            pdfdoc.close();
        }catch(Exception e){e.printStackTrace();}
    }

 public static int getCode(String code){
        int colorCode;
        if(code!=null)
            colorCode=Long.decode("0x"+code).intValue();
        else
            colorCode=Long.decode("0x000000").intValue();
        return colorCode;
    }

Ответы [ 2 ]

0 голосов
/ 29 июля 2019
    import com.documents4j.api.DocumentType; 
    import com.documents4j.api.IConverter; 
    import com.documents4j.job.LocalConverter;
    import org.apache.commons.io.output.ByteArrayOutputStream;

    import java.io.*; 
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future; 
    import java.util.concurrent.TimeUnit;

    public class Converter{
  public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {
            ByteArrayOutputStream bo = new ByteArrayOutputStream();

            InputStream in = new BufferedInputStream(new FileInputStream("d:\\input.docx"));
            IConverter converter = LocalConverter.builder()
                    .baseFolder(new File("D:\\input"))
                    .workerPool(20, 25, 2, TimeUnit.SECONDS)
                    .processTimeout(5, TimeUnit.SECONDS)
                    .build();

            Future<Boolean> conversion = converter
                    .convert(in).as(DocumentType.MS_WORD)
                    .to(bo).as(DocumentType.PDF)
                    .prioritizeWith(1000) // optional
                    .schedule();
            conversion.get();
            try (OutputStream outputStream = new FileOutputStream("D:\\output.pdf")) {
                bo.writeTo(outputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
            in.close();
            bo.close();
        }
        }

Это необходимо для Maven Dep:

<dependency>
        <groupId>com.documents4j</groupId>
        <artifactId>documents4j-api</artifactId>
        <version>0.2.1</version>
    </dependency>

    <dependency>
        <groupId>com.documents4j</groupId>
        <artifactId>documents4j-util-conversion</artifactId>
        <version>0.2.1</version>
    </dependency>

    <dependency>
        <groupId>com.documents4j</groupId>
        <artifactId>documents4j-transformer</artifactId>
        <version>0.2.1</version>
    </dependency>

    <dependency>
        <groupId>com.documents4j</groupId>
        <artifactId>documents4j-util-all</artifactId>
        <version>0.2.1</version>
    </dependency>

    <dependency>
        <groupId>com.documents4j</groupId>
        <artifactId>documents4j-local</artifactId>
        <version>0.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.8.0-beta2</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.8.0-beta2</version>
    </dependency>
    <dependency>
        <groupId>com.documents4j</groupId>
        <artifactId>documents4j-util-standalone</artifactId>
        <version>1.0.3</version>
    </dependency>
    <dependency>
        <groupId>com.documents4j</groupId>
        <artifactId>documents4j-transformer-msoffice-word</artifactId>
        <version>1.0.3</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>23.0</version>
    </dependency>

, но перед запуском необходимо установить MS Office

Наслаждайтесь!

0 голосов
/ 03 октября 2018

Если вы хотите конвертировать docx в pdf, используя APACHE-POI , вам понадобятся следующие jar-файлы с подходящими версиями

org.apache.poi.xwpf.converter.core-x.x.x.jar
org.apache.poi.xwpf.converter.pdf-x.x.x.jar

Если вы хотите использовать какую-то другую библиотеку, тогда выможете попробовать Docx4j Вы можете найти пример здесь: https://www.docx4java.org/trac/docx4j

Надеюсь, это поможет.

...