PDFBox
  1. PDFBox
  2. PDFBOX-1306

Transparent PNG file display with black border

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.7.0
    • Component/s: None
    • Labels:
      None

      Description

      Hi,

      I have added Transparent PNG file in PDF with PDFBox and it's display black border around image. I have added same PNG file with IText and it's display good in PDF.

      I have used below function to add PNG file. I am using latest PDFBox SVN code to add PNG file.

      public void createPDFFromImage( String inputFile, String image, String outputFile )
      throws IOException, COSVisitorException
      {
      // the document
      PDDocument doc = null;
      try
      {
      doc = PDDocument.load( inputFile );
      //we will add the image to the first page.
      PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get( 0 );

      PDXObjectImage ximage = null;

      /*if( image.toLowerCase().endsWith( ".jpg" ) )

      { ximage = new PDJpeg(doc, new FileInputStream( image ) ); }

      else if (image.toLowerCase().endsWith(".tif") || image.toLowerCase().endsWith(".tiff"))

      { ximage = new PDCcitt(doc, new RandomAccessFile(new File(image),"r")); }

      else

      { BufferedImage awtImage = ImageIO.read( new File( image ) ); FileInputStream inputStream = new FileInputStream(image); PDStream stream = new PDStream(doc, inputStream); ximage = new PDPixelMap(stream); //throw new IOException( "Image type not supported:" + image ); }

      */

      System.out.println("Testing");
      BufferedImage stampImage = null;
      try

      { stampImage = ImageIO.read(new File(image)); }

      catch(Exception e)

      { e.printStackTrace(); }

      ximage = new PDJpeg(doc, stampImage );
      //ximage = new PDPixelMap(doc, stampImage);
      COSStream stream = ximage.getCOSStream();
      PDStream pdStream = new PDStream(stream);
      ximage = new PDPixelMap(pdStream);
      //BoxImage imageData = BoxImage.getInstance(image);

      //System.out.println(""+imageData.getImageType());
      PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true, true);
      AffineTransform transform = new AffineTransform(stampImage.getWidth(), 0, 0, stampImage.getHeight(), 20, 200);
      //contentStream.drawImage( ximage, 20, 20 );
      contentStream.drawXObject(ximage, transform);
      contentStream.close();
      doc.save( outputFile );
      }
      finally
      {
      if( doc != null )

      { doc.close(); }

      }
      }

      1. PDFBox_NEW.pdf
        101 kB
        Manoj Patel
      2. NEW.png
        3 kB
        Manoj Patel
      3. iText_NEW.pdf
        80 kB
        Manoj Patel
      4. GeneratedFilePDFBox.pdf
        18 kB
        Manoj Patel
      5. GeneratedFileIText.pdf
        125 kB
        Manoj Patel
      6. African_Elephant_Transparent.png
        95 kB
        Manoj Patel

        Activity

        Hide
        Manoj Patel added a comment -

        Attached are the PNG and generated PDF files with PDFBox and IText

        Show
        Manoj Patel added a comment - Attached are the PNG and generated PDF files with PDFBox and IText
        Hide
        Andreas Lehmkühler added a comment -

        I fixed the smask creation in revision 1337790.

        BTW: You don't need to create an PDXObjectImage using the stream of a PDJpeg object. Just use the PDJpeg.

        Show
        Andreas Lehmkühler added a comment - I fixed the smask creation in revision 1337790. BTW: You don't need to create an PDXObjectImage using the stream of a PDJpeg object. Just use the PDJpeg.
        Hide
        Manoj Patel added a comment - - edited

        I have tried the same and it's working fine for African_Elephant_Transparent.png.

        Now have tried with NEW.png and it's gives gray border around fonts.I am using below mentioned code to scale png image in PDFBox.

        int width= (int)(stampImage.getWidth()*100/300);
        int height= (int)(stampImage.getHeight()*100/300);
        AffineTransform transform = new AffineTransform(width, 0, 0, height, 20, 200);

        I have attached NEW.png, iText_NEW.pdf and PDFBox_NEW.pdf files. You can compare result of generated PDF files.

        Show
        Manoj Patel added a comment - - edited I have tried the same and it's working fine for African_Elephant_Transparent.png. Now have tried with NEW.png and it's gives gray border around fonts.I am using below mentioned code to scale png image in PDFBox. int width= (int)(stampImage.getWidth()*100/300); int height= (int)(stampImage.getHeight()*100/300); AffineTransform transform = new AffineTransform(width, 0, 0, height, 20, 200); I have attached NEW.png, iText_NEW.pdf and PDFBox_NEW.pdf files. You can compare result of generated PDF files.
        Hide
        Andreas Lehmkühler added a comment -

        My first patch improved the SMask creation but it wasn't perfect. I optimized it once again in revision 1338247. But I'm afraid that's the maximum of quality we can get here.
        In the end it is not a good idea to use a lossy DCTFilter to compress the data. Instead one should use the lossless FlateDecode filter. I extended the PDPixelMap class similar to the PDJpeg class in revision 1338248.
        Just use a PDPixelMap instead of a PDJpeg to add an image with transparency.

        Thanks for coming back and your input.

        Show
        Andreas Lehmkühler added a comment - My first patch improved the SMask creation but it wasn't perfect. I optimized it once again in revision 1338247. But I'm afraid that's the maximum of quality we can get here. In the end it is not a good idea to use a lossy DCTFilter to compress the data. Instead one should use the lossless FlateDecode filter. I extended the PDPixelMap class similar to the PDJpeg class in revision 1338248. Just use a PDPixelMap instead of a PDJpeg to add an image with transparency. Thanks for coming back and your input.

          People

          • Assignee:
            Andreas Lehmkühler
            Reporter:
            Manoj Patel
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development