java pdf stamper_java-在for循环中使用PdfStamper的最佳方法

如我对Extract pdf page and insert into existing pdf的回答所述,使用PdfStamper只是满足您要求的一种方法.如果您需要处理单个PDF文档,并且我可以像以前的回答所示,可以从另一个PDF添加单个页面,则PdfStamper可能是您的最佳选择.

但是,您现在指出必须串联多个PDF文件.在这种情况下,使用PdfStamper并不是最佳选择.您应该考虑切换到PdfCopy:

假设您具有以下文件.

String[] paths = new String[]{

"resources/to_be_inserted_1.pdf",

"resources/to_be_inserted_2.pdf",

"resources/to_be_inserted_3.pdf"

};

您需要在路径为“ resources / main_document.pdf”的现有PDF的开头插入每个文档的第一页(并且只有第一页),然后您可以执行以下操作:

Document document = new Document();

PdfCopy copy = new PdfCopy(document, new FileOutputStream(dest));

document.open();

PdfReader reader;

for (String path : paths) {

reader = new PdfReader(path);

copy.addPage(copy.getImportedPage(reader, 1));

reader.close();

}

reader = new PdfReader("resources/main_document.pdf");

copy.addDocument(reader);

reader.close();

document.close();

如您所见,addPage()方法添加单个页面,而addDocument()方法添加文档的所有页面.

更新

似乎您不想插入新页面,但是想要叠加页面:您想在现有内容之上或之下添加页面.

在那种情况下,您确实需要PdfStamper,但是您犯了两个关键错误.

>关闭回路中的压模.压模关闭后,便关闭了:您无法向其添加任何其他内容.您需要将stamper.close()移到循环外.

>您可以在循环内关闭阅读器,但模子尚未释放阅读器.您应该先释放读者.

public static final String SRC = "resources/pdfs/primes.pdf";

public static final String[] EXTRA =

{"resources/pdfs/hello.pdf", "resources/pdfs/base_url.pdf", "resources/pdfs/state.pdf"};

public static final String DEST = "results/stamper/primes_superimpose.pdf";

PdfReader reader = new PdfReader(SRC);

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(DEST));

PdfContentByte canvas = stamper.getUnderContent(1);

PdfReader r;

PdfImportedPage page;

for (String path : EXTRA) {

r = new PdfReader(path);

page = stamper.getImportedPage(r, 1);

canvas.addTemplate(page, 0, 0);

stamper.getWriter().freeReader(r);

r.close();

}

stamper.close();

在这种情况下,我总是将导入的页面添加到主文档的页面1中.如果要将导入的页面添加到其他页面,则需要在循环内部创建canvas对象.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过使用ZipOutputStream和ZipInputStream类来实现文件的压缩和解压缩,但是这两个类只支持Zip格式的压缩文件。对于PDF格式的文件,可以使用iText库来实现压缩和解压缩。 以下是一个使用iText库实现PDF文件压缩和解压缩的示例代码: ```java import java.io.*; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; public class PDFCompressor { public static void compressPdf(String srcFile, String destFile) throws Exception { PdfReader reader = new PdfReader(srcFile); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destFile)); PdfCompressionSettings compression = new PdfCompressionSettings(); compression.setCompressionLevel(PdfStream.BEST_COMPRESSION); stamper.setCompressionLevel(9); stamper.setFullCompression(); stamper.getWriter().setCompressionLevel(9); stamper.getWriter().setCompressionLevel(9, compression); stamper.close(); reader.close(); } public static void decompressPdf(String srcFile, String destFile) throws Exception { PdfReader.unethicalreading = true; PdfReader reader = new PdfReader(srcFile); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destFile)); stamper.getWriter().setCompressionLevel(0); stamper.close(); reader.close(); } public static void main(String[] args) { try { compressPdf("example.pdf", "example_compressed.pdf"); decompressPdf("example_compressed.pdf", "example_decompressed.pdf"); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码,compressPdf方法用于压缩PDF文件,decompressPdf方法用于解压缩PDF文件。在compressPdf方法,我们使用PdfStamper类来设置PDF文件的压缩级别和压缩方式。在decompressPdf方法,我们将PDF文件的压缩级别设置为0,以实现解压缩。 需要注意的是,iText库需要额外下载并添加到项目。可以从官网https://itextpdf.com/zh/download下载最新版本的iText库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值