{"id":1482,"date":"2014-04-09T12:02:05","date_gmt":"2014-04-09T03:02:05","guid":{"rendered":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/?p=1482"},"modified":"2015-03-04T11:45:27","modified_gmt":"2015-03-04T02:45:27","slug":"pdf%e5%86%85%e3%81%ae%e3%81%99%e3%81%b9%e3%81%a6%e3%81%ae%e7%94%bb%e5%83%8f%e3%81%ab%e3%80%81%e4%b8%80%e6%b0%97%e3%81%ab%e9%80%8f%e3%81%8b%e3%81%97%e6%96%87%e5%ad%97%ef%bc%88%e3%82%a6%e3%82%a9","status":"publish","type":"post","link":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/2014\/04\/09\/pdf%e5%86%85%e3%81%ae%e3%81%99%e3%81%b9%e3%81%a6%e3%81%ae%e7%94%bb%e5%83%8f%e3%81%ab%e3%80%81%e4%b8%80%e6%b0%97%e3%81%ab%e9%80%8f%e3%81%8b%e3%81%97%e6%96%87%e5%ad%97%ef%bc%88%e3%82%a6%e3%82%a9\/","title":{"rendered":"PDF\u5185\u306e\u3059\u3079\u3066\u306e\u753b\u50cf\u306b\u3001\u4e00\u6c17\u306b\u900f\u304b\u3057\u6587\u5b57\uff08\u30a6\u30a9\u30fc\u30bf\u30fc\u30de\u30fc\u30af\uff09\u3092\u5165\u308c\u308b"},"content":{"rendered":"<p>\u3042\u307e\u308a\u306a\u3055\u305d\u3046\u306a\u72b6\u6cc1\u3067\u306f\u3042\u308a\u307e\u3059\u304c\u3001\u305b\u3063\u304b\u304f\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u3063\u305f\u306e\u3067\u516c\u958b\u3057\u3066\u304a\u304d\u307e\u3059\u3002<br \/>\n\u5b9f\u88c5\u8a00\u8a9e\u306fJava\u3067\u3059\u3002<\/p>\n<h3>\u5fc5\u8981\u306a\u30e9\u30a4\u30d6\u30e9\u30ea<\/h3>\n<ul>\n<li><a href=\"http:\/\/sourceforge.jp\/projects\/sfnet_itext\/releases\/\" target=\"_blank\">itextpdf-5.5.0.jar\u3001itext-asian.jar<\/a><\/li>\n<li><a href=\"http:\/\/www.slf4j.org\/\" target=\"_blank\">slf4j-api-1.7.7.jar<\/a><\/li>\n<li><a href=\"http:\/\/logback.qos.ch\/\" target=\"_blank\">logback-core-1.1.2.jar, logback-classic-1.1.2.jar<\/a><\/li>\n<\/ul>\n<p>\u203bslf4j\u3068logback\u306f\u30ed\u30b0\u51fa\u529b\u306b\u4f7f\u3063\u3066\u3044\u308b\u3060\u3051\u306a\u306e\u3067\u3001\u306a\u304f\u3066\u3082\u826f\u3044\u3002<\/p>\n<h3>\u30b3\u30fc\u30c9<\/h3>\n<pre class=\"lang:java decode:true toolbar-overlay:false \" title=\"ReplaceImages.java\" >package com.lumiere_couleur.java.pdfwatermark;\r\n \r\nimport java.awt.Color;\r\nimport java.awt.Font;\r\nimport java.awt.FontMetrics;\r\nimport java.awt.Graphics2D;\r\nimport java.awt.RenderingHints;\r\nimport java.awt.geom.AffineTransform;\r\nimport java.awt.image.BufferedImage;\r\nimport java.awt.image.Raster;\r\nimport java.io.ByteArrayInputStream;\r\nimport java.io.ByteArrayOutputStream;\r\nimport java.io.File;\r\nimport java.io.FileInputStream;\r\nimport java.io.FileNotFoundException;\r\nimport java.io.FileOutputStream;\r\nimport java.io.IOException;\r\nimport java.util.Iterator;\r\n \r\nimport javax.imageio.ImageIO;\r\nimport javax.imageio.ImageReader;\r\nimport javax.imageio.stream.ImageInputStream;\r\n \r\nimport org.slf4j.Logger;\r\nimport org.slf4j.LoggerFactory;\r\n \r\nimport com.itextpdf.text.DocumentException;\r\nimport com.itextpdf.text.pdf.PRStream;\r\nimport com.itextpdf.text.pdf.PdfDictionary;\r\nimport com.itextpdf.text.pdf.PdfName;\r\nimport com.itextpdf.text.pdf.PdfNumber;\r\nimport com.itextpdf.text.pdf.PdfObject;\r\nimport com.itextpdf.text.pdf.PdfReader;\r\nimport com.itextpdf.text.pdf.PdfStamper;\r\nimport com.itextpdf.text.pdf.parser.PdfImageObject;\r\n \r\npublic class ReplaceImages {\r\n \r\n    private static final Logger log = LoggerFactory\r\n            .getLogger(ReplaceImages.class);\r\n \r\n    public static float FACTOR = 1.0f;\r\n \r\n    public static void main(String[] args) {\r\n        if (args.length &amp;lt; 3) {\r\n            System.err\r\n                    .println(\"Usage: java ReplaceImages input_pdf output_pdf watermark\");\r\n            System.exit(1);\r\n        }\r\n        String input_pdf = args[0];\r\n        String output_pdf = args[1];\r\n        String watermark = args[2];\r\n        if (input_pdf == null || input_pdf.length() == 0\r\n                || !(new File(input_pdf).exists())) {\r\n            System.err\r\n                    .println(\"Usage: java ReplaceImages input_pdf output_pdf watermark\");\r\n            System.exit(1);\r\n        }\r\n \r\n        try {\r\n            PdfReader reader = new PdfReader(new FileInputStream(input_pdf));\r\n            int n = reader.getXrefSize();\r\n            PdfObject object;\r\n            PRStream stream;\r\n            for (int i = 0; i &amp;lt; n; i++) {\r\n                object = reader.getPdfObject(i);\r\n \r\n                if (object == null || !object.isStream()) {\r\n                    continue;\r\n                }\r\n \r\n                PdfDictionary dic = (PdfDictionary) PdfReader\r\n                        .getPdfObject(object);\r\n                if (dic == null) {\r\n                    continue;\r\n                }\r\n \r\n                PdfName type = (PdfName) PdfReader.getPdfObject(dic\r\n                        .get(PdfName.SUBTYPE));\r\n                if (!PdfName.IMAGE.equals(type)) {\r\n                    continue;\r\n                }\r\n \r\n                stream = (PRStream) object;\r\n \r\n                PdfImageObject image = new PdfImageObject(stream);\r\n \r\n                BufferedImage bi = null;\r\n                try {\r\n                    bi = image.getBufferedImage();\r\n                } catch (javax.imageio.IIOException e) {\r\n                    \/\/ Unsupported Image Type\r\n \r\n                    \/\/ CMYK \u2192 RGB\u306b\u5909\u63db\r\n                    \/\/ http:\/\/stackoverflow.com\/questions\/2408613\/problem-reading-jpeg-image-using-imageio-readfile-file\r\n                    byte[] imgbytes = image.getImageAsBytes();\r\n                    if (imgbytes == null) {\r\n                        continue;\r\n                    }\r\n \r\n                    \/\/ Find a suitable ImageReader\r\n                    Iterator&amp;lt;ImageReader&amp;gt; readers = ImageIO\r\n                            .getImageReadersByFormatName(\"JPEG\");\r\n                    ImageReader imageReader = null;\r\n                    while (readers.hasNext()) {\r\n                        imageReader = (ImageReader) readers.next();\r\n                        if (imageReader.canReadRaster()) {\r\n                            break;\r\n                        }\r\n                    }\r\n \r\n                    \/\/ Stream the image file (the original CMYK image)\r\n                    ImageInputStream input = ImageIO\r\n                            .createImageInputStream(new ByteArrayInputStream(\r\n                                    imgbytes));\r\n                    imageReader.setInput(input);\r\n \r\n                    \/\/ Read the image raster\r\n                    Raster raster = imageReader.readRaster(0, null);\r\n \r\n                    \/\/ Create a new RGB image\r\n                    bi = new BufferedImage(raster.getWidth(),\r\n                            raster.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);\r\n \r\n                    \/\/ Fill the new image with the old raster\r\n                    bi.getRaster().setRect(raster);\r\n                }\r\n \r\n                if (bi == null) {\r\n                    continue;\r\n                }\r\n                int width = (int) (bi.getWidth() * FACTOR);\r\n                int height = (int) (bi.getHeight() * FACTOR);\r\n                BufferedImage img = new BufferedImage(width, height,\r\n                        BufferedImage.TYPE_INT_RGB);\r\n                AffineTransform at = AffineTransform.getScaleInstance(FACTOR,\r\n                        FACTOR);\r\n                Graphics2D g = img.createGraphics();\r\n                g.drawRenderedImage(bi, at);\r\n \r\n                \/\/ \u900f\u304b\u3057\u3092\u5165\u308c\u308b\r\n                g.setPaint(Color.WHITE);\r\n                Font font = new Font(\"\u30e1\u30a4\u30ea\u30aa\", Font.PLAIN, 18);\r\n                g.setFont(font);\r\n                g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,\r\n                        RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\r\n \r\n                String s = watermark;\r\n                FontMetrics fm = g.getFontMetrics();\r\n                int x = img.getWidth() - fm.stringWidth(s) - 10;\r\n                int y = img.getHeight() - 10;\r\n \r\n                \/\/ \u6587\u5b57\u80cc\u666f\r\n                g.setColor(new Color(1f, 1f, 1f, 0.5f));\r\n                int bgx = x - 10;\r\n                int bgy = y - 10 - font.getSize() \/ 2 - 5;\r\n                g.fillRect(bgx, bgy, img.getWidth() - bgx, img.getHeight()\r\n                        - bgy);\r\n \r\n                \/\/ \u6587\u5b57\r\n                g.setColor(Color.BLACK);\r\n                g.drawString(s, x, y);\r\n \r\n                ByteArrayOutputStream imgBytes = new ByteArrayOutputStream();\r\n                ImageIO.write(img, \"JPG\", imgBytes);\r\n                stream.clear();\r\n                stream.setData(imgBytes.toByteArray(), false,\r\n                        PRStream.NO_COMPRESSION);\r\n                stream.put(PdfName.TYPE, PdfName.XOBJECT);\r\n                stream.put(PdfName.SUBTYPE, PdfName.IMAGE);\r\n                stream.put(PdfName.FILTER, PdfName.DCTDECODE);\r\n                stream.put(PdfName.WIDTH, new PdfNumber(width));\r\n                stream.put(PdfName.HEIGHT, new PdfNumber(height));\r\n                stream.put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));\r\n                stream.put(PdfName.COLORSPACE, PdfName.DEVICERGB);\r\n            }\r\n            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(\r\n                    output_pdf));\r\n            stamper.close();\r\n        } catch (FileNotFoundException e) {\r\n            e.printStackTrace();\r\n        } catch (DocumentException e) {\r\n            e.printStackTrace();\r\n        } catch (IOException e) {\r\n            e.printStackTrace();\r\n        }\r\n \r\n        log.debug(\"done\");\r\n    }\r\n}<\/pre>\n<p>\u3042\u30fc\u3064\u304b\u308c\u305f\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3042\u307e\u308a\u306a\u3055\u305d\u3046\u306a\u72b6\u6cc1\u3067\u306f\u3042\u308a\u307e\u3059\u304c\u3001\u305b\u3063\u304b\u304f\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u3063\u305f\u306e\u3067\u516c\u958b\u3057\u3066\u304a\u304d\u307e\u3059\u3002 \u5b9f\u88c5\u8a00\u8a9e\u306fJava\u3067\u3059\u3002 \u5fc5\u8981\u306a\u30e9\u30a4\u30d6\u30e9\u30ea itextpdf-5.5.0.jar\u3001itext-asian.jar slf4j-api- &hellip; <a href=\"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/2014\/04\/09\/pdf%e5%86%85%e3%81%ae%e3%81%99%e3%81%b9%e3%81%a6%e3%81%ae%e7%94%bb%e5%83%8f%e3%81%ab%e3%80%81%e4%b8%80%e6%b0%97%e3%81%ab%e9%80%8f%e3%81%8b%e3%81%97%e6%96%87%e5%ad%97%ef%bc%88%e3%82%a6%e3%82%a9\/\" class=\"more-link\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"screen-reader-text\">PDF\u5185\u306e\u3059\u3079\u3066\u306e\u753b\u50cf\u306b\u3001\u4e00\u6c17\u306b\u900f\u304b\u3057\u6587\u5b57\uff08\u30a6\u30a9\u30fc\u30bf\u30fc\u30de\u30fc\u30af\uff09\u3092\u5165\u308c\u308b<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[82,17],"tags":[],"class_list":["post-1482","post","type-post","status-publish","format-standard","hentry","category-java","category-programming"],"_links":{"self":[{"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/posts\/1482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/comments?post=1482"}],"version-history":[{"count":10,"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/posts\/1482\/revisions"}],"predecessor-version":[{"id":1876,"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/posts\/1482\/revisions\/1876"}],"wp:attachment":[{"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/media?parent=1482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/categories?post=1482"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/hello.lumiere-couleur.com\/smilkobuta\/wp-json\/wp\/v2\/tags?post=1482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}