问题
I've a requirement, where I am generating different pdf' using iText 7.1.11
. I am using PdfMerger
to merge all pdf's on the fly. I am able to generate pdf successfully at my local system, but the application needs to send bye[]
in response. The solution I found here and here . but the problem is PdfMerger
does not accept Document
object, and I am not sure if i revert my code to use Document
instead of PdfDocument
will it work or not.
Below is the code, with what I tried.
public static void createPdf(List<String> src, String dest, PageSize pageSize, boolean rotate, String baseUri) throws IOException {
ConverterProperties properties = new ConverterProperties();
properties.setBaseUri(baseUri);
FontProvider fontProvider = new DefaultFontProvider(false,false,true);
properties.setFontProvider(fontProvider);
/** tried this to make return byte[] in response
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PdfDocument pdf = new PdfDocument(new PdfWriter(byteArrayOutputStream));
Document doc = new Document(pdfDoc); **/
///////////// Working on Local/////
PdfWriter writer = new PdfWriter(dest); // 'dest' is local file system path
PdfDocument pdf = new PdfDocument(writer);
PdfMerger merger = new PdfMerger(pdf);
for (String html : src) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfDocument temp = new PdfDocument(new PdfWriter(baos));
if(rotate) {
temp.setDefaultPageSize(pageSize.rotate()); /** Page Size and Orientation */
} else {
temp.setDefaultPageSize(pageSize); /** Page Size and Orientation */
}
HtmlConverter.convertToPdf(html, temp, properties);
temp = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())));
merger.merge(temp, 1, temp.getNumberOfPages());
temp.close();
}
pdf.close();}
Please help me, as this simple thing seems difficult to achieve
回答1:
This is how you initialize your PdfMerger
:
PdfWriter writer = new PdfWriter(dest); // 'dest' is local file system path
PdfDocument pdf = new PdfDocument(writer);
PdfMerger merger = new PdfMerger(pdf);
I.e. you explicitly write to the local file system and even stress that fact in the comment.
If you want to have the merged PDF in a byte[]
at the end, why don't you simply use a ByteArrayOutputStream
here (as you claim you have tried a few lines earlier):
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(byteArrayOutputStream );
PdfDocument pdf = new PdfDocument(writer);
PdfMerger merger = new PdfMerger(pdf);
...
pdf.close();
byte[] bytes = byteArrayOutputStream.toByteArray();
来源:https://stackoverflow.com/questions/63010524/pdfdocument-to-byte-using-pdfmerger-itext7