如何在Java中编程减小PDF文件的大小?

11
Document document = new Document(reader.getPageSizeWithRotation(1));
PdfCopy writer = new PdfCopy(document, new FileOutputStream(outFile));
document.open();
PdfImportedPage page = writer.getImportedPage(reader, ++i);
writer.setFullCompression();
writer.addPage(page);
document.close();
writer.close();

我正在使用iText来分割和合并PDF文件,我需要你的帮助以编程方式减小(压缩)输出PDF文件的大小。请告诉我如何实现。


我浏览了这个帖子,但是没有找到有用的信息。 - jcrshankar
5个回答

7

使用 iText

PdfReader reader = new PdfReader(new FileInputStream("input.pdf"));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf"));
int total = reader.getNumberOfPages() + 1;
for ( int i=1; i<total; i++) {
   reader.setPageContent(i + 1, reader.getPageContent(i + 1));
}
stamper.setFullCompression();
stamper.close();

重新排序加1。类似的情况:http://osdir.com/ml/java.lib.itext.general/2007-09/msg00128.html - nicolallias

7

使用writer.setFullCompression(),您已经尽可能地压缩了文件。使用iText,您无法再进行更多操作。


哦,谢谢Partlov。那么您建议我采用其他技术来实现相同的目标。 - jcrshankar
3
通常来说,这是不正确的。您始终可以从文件中提取光栅图像,降低其分辨率,然后将它们放回文件中。 - yms
您还可以更改无损压缩图像的压缩类型,而使用有损算法。 - yms

4

同时将PdfCopy更改为PdfSmartCopy。它会消除具有相同哈希(md5)的重复流。


我使用了iText PDF压缩,但它没有起作用。 - tamil

0
多个位图图像转换为 PDF --> 压缩 PDF
public static String  createPDFWithMultipleImage(Bitmap[] bitmaps, String pdf_name){
    String directoryPath = Environment.getExternalStorageDirectory() + "/OpPath/";

    File file = new File(directoryPath,pdf_name);
    try {
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        PdfDocument pdfDocument = new PdfDocument();
        for (int i = 0; i < bitmaps.length; i++){
            Bitmap original = bitmaps[i];
            int nh = (int) ( original.getHeight() * (512.0 / original.getWidth()) );
            Bitmap bitmap = Bitmap.createScaledBitmap(original, 512, nh, true);

            PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(bitmap.getWidth(), bitmap.getHeight(), (i + 1)).create();
            PdfDocument.Page page = pdfDocument.startPage(pageInfo);
            Canvas canvas = page.getCanvas();
            Paint paint = new Paint();
            paint.setColor(Color.BLUE);
            canvas.drawPaint(paint);
            canvas.drawBitmap(bitmap, 0f, 0f, null);
            pdfDocument.finishPage(page);
            bitmap.recycle();
        }
        pdfDocument.writeTo(fileOutputStream);
        pdfDocument.close();
        return file.toString();

    } catch (IOException e) {
        e.printStackTrace();
        return file.toString();
    }
}

0
你可以使用Ghostscript,通过调用exe并传入特定参数来打印你的pdf文件,使用Ghostscript的pdfwriter(例如:sDEVICE=pdfwrite -sOutputFile=myfile.pdf)。有几个可接受的参数,用于压缩或质量级别等方面。这可能会生成优化和更小的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接