iText - Невозможно добавить содержимое в существующую страницу PDF, используя PdfWriter и PdfCopy за один цикл - PullRequest
0 голосов
/ 04 апреля 2020

Мне нужно использовать два метода для записи содержимого на существующей странице PDF с использованием PdfWriter и объединения PDF-файлов с помощью PdfCopy. Я хочу сделать это в одном l oop. Объект PdfWriter не объединяет PDF как исходную страницу. мы должны создать новую страницу (A4) и добавить в нее контент со страницы источника. Чтобы избежать этого, мы можем использовать объект Pdfcopy, который объединяет точный размер страниц PDF с исходным файлом. Но проблема здесь в том, что мне нужно сначала объединить, а затем вызвать объединенный файл, чтобы снова добавить содержимое. Поскольку в файле PDF много страниц, эта операция выполняется с использованием двух циклов.

Невозможно использовать опцию PdfCopy в том же l oop.

Вот мои два метода:

public boolean mergePDFsinOneFile(List<InputStream> list, OutputStream outputStream,List<Integer> allDocId,int conDocId){

        com.itextpdf.text.Document document = new com.itextpdf.text.Document();
        PdfCopy copy = new PdfCopy(document, outputStream);

        document.open();

        String storagePath = sql.getDirectoryPath();
        PdfReader reader = null;

        for(int docId : allDocId) {
            String finalPath = "";
            ResultSet doc = sql.getDocumentDetails(docId);
            if(doc.next()) {
                String relative_path = doc.getString("RELATIVE_PATH"); 

                if(relative_path.endsWith(".pdf") || relative_path.endsWith(".PDF")){

                    finalPath = storagePath +relative_path;
                    reader = new PdfReader(finalPath);

                    copy.addDocument(reader);
                    copy.freeReader(reader);
                }
            }
        }

        reader.close();
        outputStream.flush();
        document.close();
        outputStream.close();

        System.out.println("document merged");
        return true;

}

И еще один метод:

public boolean mergePDFsinOneFileTe(List<InputStream> list, OutputStream outputStream,List<Integer> allDocId,int conDocId){

        com.itextpdf.text.Document document = new com.itextpdf.text.Document();//PageSize.A4
        PdfWriter writer = PdfWriter.getInstance(document, outputStream);
        document.open();

        PdfContentByte cb = writer.getDirectContent();
        BaseFont bf = BaseFont.createFont();
        cb.setFontAndSize(bf, 8);

        String storagePath = sql.getDirectoryPath();
        ResultSet conDocResult = sql.getDocumentDetails(conDocId);
        String printText = "";
        String docName = "";
        if(conDocResult.next())
            docName = conDocResult.getString("DOCUMENT_NAME");

        for(int docId : allDocId) {
            String finalPath = "";
            printText = "";
            ResultSet doc = sql.getDocumentDetails(docId);
            if(doc.next()) {
                String relative_path = doc.getString("RELATIVE_PATH"); 

                if(relative_path.endsWith(".pdf") || relative_path.endsWith(".PDF")){
                    String docTypePrefix = "";
                    int typeValue = 0;

                    finalPath = storagePath +relative_path;
                    PdfReader reader = new PdfReader(finalPath);
                    System.out.println("finalPath "+finalPath);

                    ResultSet docTypeResult = sql.getDoctypeDetails(doc.getInt("DOCUMENT_TYPE_ID"));
                    if(docTypeResult.next())
                        docTypePrefix = docTypeResult.getString("CONSO_SUFFIX_NAME"); //PREFIX

                    ResultSet consolValue = sql.getConsolidateTypeValueByTypeId(doc.getInt("DOCUMENT_TYPE_ID"));
                    if(consolValue.next())
                        typeValue = Integer.parseInt(consolValue.getString("VALUE"));

                    printText = docName + "-" + "[" + typeValue + "]" + "-" + docTypePrefix;
                    for(int i = 1; i <= reader.getNumberOfPages();i++){
                        PdfImportedPage page = writer.getImportedPage(reader, i);
                        cb.addTemplate(page, 0, 0);
                        cb.beginText();
                        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase(printText), document.left(), document.bottom() - 20, 0);
                        cb.endText();
                        document.newPage();
                    }
                }
            }
        }

        outputStream.flush();
        document.close();
        outputStream.close();
        System.out.println("document merged");
        return true;

}

Как записать содержимое во время цикла и объединить в одно и то же время? Пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...