В вашем коде было множество ошибок.Например: вам не нужно org.w3c.dom.Document
, вам нужно com.itextpdf.text.Document
;эта ошибка приводила к тому, что ваш код даже не мог быть скомпилирован.
Я исправил ошибки и в результате получил SSCCE:
package sandbox.merge;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSmartCopy;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
public class ForStack {
public static void main(String[] args) throws IOException, DocumentException, ParseException {
createContractWithMoreFile();
}
public static void createContractWithMoreFile()
throws IOException, DocumentException, ParseException {
String linkPDF = "resources/pdfs/User.pdf";
PdfReader reader = new PdfReader(linkPDF);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, baos);
PdfWriter writer = stamper.getWriter();
writer.setPdfVersion(PdfWriter.VERSION_1_7);
AcroFields form = stamper.getAcroFields();
form.setField("Name", "Jhon");
stamper.setFormFlattening(true);
stamper.close();
String out = "results/merged.pdf";
List<byte[]> listOfPdfFiles = new ArrayList<>();
listOfPdfFiles.add(baos.toByteArray());
byte[] informativaPrivacy = getPdfByteArray("resources/pdfs/second.pdf");
listOfPdfFiles.add(informativaPrivacy);
concatenatePdfs(listOfPdfFiles, new File(out));
baos.close();
reader.close();
}
public static byte[] getPdfByteArray(String filePath) {
File fileP = new File(filePath);
byte[] result;
try {
result = FileUtils.readFileToByteArray(fileP);
return result;
} catch (IOException e) {
return null;
}
}
public static void concatenatePdfs(List<byte[]> listOfPdfFiles, File outputFile) throws DocumentException, IOException {
Document document = new Document();
FileOutputStream outputStream = new FileOutputStream(outputFile);
PdfCopy copy = new PdfSmartCopy(document, outputStream);
document.open();
for (byte[] inFile : listOfPdfFiles) {
PdfReader reader = new PdfReader(inFile);
copy.addDocument(reader);
reader.close();
}
document.close();
}
}
Я мог воспроизвести проблему, о которой вы упоминали, только удаливследующая строка:
stamper.setFormFlattening(true);
Эта строка отсутствует в вашем коде и объясняет, почему форма не сплющена.
Обобщена:
Когда вы расправляете форму, у вас есть это:
Где когда-то было поле "Name"
, мы видим значение "Jhon"
, носамо поле пропало: вот в чем заключается уплощение: вы удаляете всю интерактивность.
Когда вы не расплющиваете форму, у вас есть это:
Интерактивное поле все еще там, не разглажено.Он был заполнен значением "Jhon"
.
Кажется, что OP хочет сгладить форму, как на первом снимке экрана, и в то же время сохранить поле, как на втором снимке экрана.Это противопоказание.ОП должен уточнить, что ожидается, если потребуется ответ.
Версия iText
Кстати: я использовал iText 5.5.13 для проверки этого.Помните, что iText 5 больше не поддерживается, если вы не являетесь платным клиентом.Текущая версия - iText 7.1.2, но в 7.1.2 класс PdfStamper
больше не существует.Заполнение форм и объединение документов в iText 7 выполняется по-другому.