【问题标题】:How to convert a .dcm file to a pdf file?如何将 .dcm 文件转换为 pdf 文件?
【发布时间】:2016-04-22 18:40:25
【问题描述】:

为了转换 pdf 文件,我使用了 pdf2dcm.java 类。但是,现在我需要将 dicom 文件转换为 pdf 才能阅读文档的内容。怎么做?是否有任何java类能够做到这一点?

【问题讨论】:

    标签: java dcm4che


    【解决方案1】:

    Dcm4che 有您想要的。请看https://sourceforge.net/projects/dcm4che/

    【讨论】:

    • 我没有找到合适的课程。
    【解决方案2】:

    首先您可以将 DCM 转换为 jpg,然后将 JPG 转换为 PDF

    import java.io.File;
    import java.io.IOException;
    public class DCM2JPG_Convert {
        public static void main(String[] args) throws IOException {
           try{
                File src = new File("d:\\CHESTP.dcm");
                File dest = new File("d:\\CHEST_PA12.jpg");           
                Dcm2Jpeg dcm2jpg= new Dcm2Jpeg();           
                dcm2jpg.convert(src, dest);         
                System.out.println("Completed");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    
    
    import java.awt.image.BufferedImage;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.util.Iterator;
    import java.util.List;
    
    import javax.imageio.ImageIO;
    import javax.imageio.ImageReader;
    import javax.imageio.stream.ImageInputStream;
    
    import org.apache.commons.cli.CommandLine;
    import org.apache.commons.cli.GnuParser;
    import org.apache.commons.cli.HelpFormatter;
    import org.apache.commons.cli.OptionBuilder;
    import org.apache.commons.cli.Options;
    import org.apache.commons.cli.ParseException;
    import org.dcm4che2.data.DicomObject;
    import org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam;
    import org.dcm4che2.io.DicomInputStream;
    import org.dcm4che2.util.CloseUtils;
    
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    
    
    public class Dcm2Jpeg {
    
        private static final String USAGE =
            "dcm2jpg [Options] <dcmfile> <jpegfile>\n" +
            "or dcm2jpg [Options] <dcmfile>... <outdir>\n" +
            "or dcm2jpg [Options] <indir>... <outdir>";
        private static final String DESCRIPTION = 
            "Convert DICOM image(s) to JPEG(s)\nOptions:";
        private static final String EXAMPLE = null;
        private int frame = 1;
        private float center;
        private float width;
        private String vlutFct;
        private boolean autoWindowing;
        private DicomObject prState;
        private short[] pval2gray;
        private String fileExt = ".jpg";
    
        private void setFrameNumber(int frame) {
            this.frame = frame;
        }
    
        private void setWindowCenter(float center) {
            this.center = center;        
        }
    
        private void setWindowWidth(float width) {
            this.width = width;       
        }
    
        public final void setVoiLutFunction(String vlutFct) {
            this.vlutFct = vlutFct;
        }    
    
        private final void setAutoWindowing(boolean autoWindowing) {
            this.autoWindowing = autoWindowing;
        }
    
        private final void setPresentationState(DicomObject prState) {
            this.prState = prState;        
        }
    
        private final void setPValue2Gray(short[] pval2gray) {
            this.pval2gray = pval2gray;
        }
    
        public final void setFileExt(String fileExt) {
            this.fileExt = fileExt;
        }
    
        public void convert(File src, File dest) throws IOException {
            Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
            ImageReader reader = iter.next();
            DicomImageReadParam param = 
                (DicomImageReadParam) reader.getDefaultReadParam();
            param.setWindowCenter(center);
            param.setWindowWidth(width);
            param.setVoiLutFunction(vlutFct);
            param.setPresentationState(prState);
            param.setPValue2Gray(pval2gray);
            param.setAutoWindowing(autoWindowing);
            ImageInputStream iis = ImageIO.createImageInputStream(src);
            BufferedImage bi;
            OutputStream out = null;
            try {
                reader.setInput(iis, false);
                bi = reader.read(frame - 1, param);
                if (bi == null) {
                    System.out.println("\nError: " + src + " - couldn't read!");
                    return;
                }
                out = new BufferedOutputStream(new FileOutputStream(dest));
                JPEGImageEncoder enc = JPEGCodec.createJPEGEncoder(out);
                enc.encode(bi);
            } finally {
                CloseUtils.safeClose(iis);
                CloseUtils.safeClose(out);
            }
            //System.out.print('.');
        }
    
        public int mconvert(List<String> args, int optind, File destDir)
                throws IOException {
            int count = 0;
            for (int i = optind, n = args.size() - 1; i < n; ++i) {
                File src = new File(args.get(i));
                count += mconvert(src, new File(destDir, src2dest(src)));
            }
            return count;
        }
    
        private String src2dest(File src) {
            String srcname = src.getName();
            return src.isFile() ? srcname + this.fileExt : srcname;
        }
    
        public int mconvert(File src, File dest) throws IOException {
            if (!src.exists()) {
                System.err.println("WARNING: No such file or directory: " + src
                        + " - skipped.");                
                return 0;
            }
            if (src.isFile()) {
                try {
                    convert(src, dest);
                } catch (Exception e) {
                    System.err.println("WARNING: Failed to convert " + src + ":");
                    e.printStackTrace(System.err);
                    System.out.print('F');
                    return 0;
                }
                System.out.print('.');
                return 1;
            }
            File[] files = src.listFiles();
            if (files.length > 0 && !dest.exists()) {
                dest.mkdirs();
            }
            int count = 0;
            for (int i = 0; i < files.length; ++i) {
                count += mconvert(files[i], new File(dest, src2dest(files[i])));
            }
            return count;
        }
    
        @SuppressWarnings("unchecked")
        public static void main(String args[]) throws Exception {
            CommandLine cl = parse(args);
            Dcm2Jpeg dcm2jpg = new Dcm2Jpeg();
            if (cl.hasOption("f")) {
                dcm2jpg.setFrameNumber(
                        parseInt(cl.getOptionValue("f"),
                                "illegal argument of option -f",
                                1, Integer.MAX_VALUE));
            }
            if (cl.hasOption("p")) {
                dcm2jpg.setPresentationState(loadDicomObject(
                        new File(cl.getOptionValue("p"))));
            }
            if (cl.hasOption("pv2gray")) {
                dcm2jpg.setPValue2Gray(loadPVal2Gray(
                        new File(cl.getOptionValue("pv2gray"))));
            }        
            if (cl.hasOption("c")) {
                dcm2jpg.setWindowCenter(
                        parseFloat(cl.getOptionValue("c"),
                                "illegal argument of option -c"));
            }
            if (cl.hasOption("w")) {
                dcm2jpg.setWindowWidth(
                        parseFloat(cl.getOptionValue("w"),
                                "illegal argument of option -w"));
            }
            if (cl.hasOption("sigmoid")) {
                dcm2jpg.setVoiLutFunction(DicomImageReadParam.SIGMOID);
            }
            dcm2jpg.setAutoWindowing(!cl.hasOption("noauto"));
            if (cl.hasOption("jpgext")) {
                dcm2jpg.setFileExt(cl.getOptionValue("jpgext"));
            }
            final List<String> argList = cl.getArgList();
            int argc = argList.size();
    
            File dest = new File(argList.get(argc-1));
            long t1 = System.currentTimeMillis();
            int count = 1;
            if (dest.isDirectory()) {
                count = dcm2jpg.mconvert(argList, 0, dest);
            } else {
                File src = new File(argList.get(0));
                if (argc > 2 || src.isDirectory()) {
                    exit("dcm2jpg: when converting several files, "
                            + "last argument must be a directory\n");
                }
                dcm2jpg.convert(src, dest);
            }
            long t2 = System.currentTimeMillis();
            System.out.println("\nconverted " + count + " files in " + (t2 - t1)
                    / 1000f + " s.");
        }
    
        private static DicomObject loadDicomObject(File file) {
            DicomInputStream in = null;
            try {
                in = new DicomInputStream(file);
                return in.readDicomObject();
            } catch (IOException e) {
                exit(e.getMessage());
                throw new RuntimeException();
            } finally {
                CloseUtils.safeClose(in);
            }
    }
    
    private static short[] loadPVal2Gray(File file) {
            BufferedReader r = null;
            try {
                r = new BufferedReader(new InputStreamReader(new FileInputStream(
                        file)));
                short[] pval2gray = new short[256];
                int n = 0;
                String line;
                while ((line = r.readLine()) != null) {
                    try {
                        int val = Integer.parseInt(line.trim());
                        if (n == pval2gray.length) {
                            if (n == 0x10000) {
                                exit("Number of entries in " + file + " > 2^16");
                            }
                            short[] tmp = pval2gray;
                            pval2gray = new short[n << 1];
                            System.arraycopy(tmp, 0, pval2gray, 0, n);
                        }
                        pval2gray[n++] = (short) val;
                    } catch (NumberFormatException nfe) {
                        // ignore lines where Integer.parseInt fails
                    }
                }
                if (n != pval2gray.length) {
                    exit("Number of entries in " + file + ": " + n
                            + " != 2^[8..16]");
                }
                return pval2gray;
            } catch (IOException e) {
                exit(e.getMessage());
                throw new RuntimeException();
            } finally {
                CloseUtils.safeClose(r);
            }
        }
    
    private static CommandLine parse(String[] args) {
            Options opts = new Options();
            OptionBuilder.withArgName("frame");
            OptionBuilder.hasArg();
            OptionBuilder.withDescription(
                    "frame to convert, 1 (= first frame) by default");
            opts.addOption(OptionBuilder.create("f"));
            OptionBuilder.withArgName("prfile");
            OptionBuilder.hasArg();
            OptionBuilder.withDescription(
                    "file path of presentation state to apply");
            opts.addOption(OptionBuilder.create("p"));
            OptionBuilder.withArgName("center");
            OptionBuilder.hasArg();
            OptionBuilder.withDescription("Window Center");
            opts.addOption(OptionBuilder.create("c"));
            OptionBuilder.withArgName("width");
            OptionBuilder.hasArg();
            OptionBuilder.withDescription("Window Width");
            opts.addOption(OptionBuilder.create("w"));
            opts.addOption("sigmoid", false,
                    "apply sigmoid VOI LUT function with given Window Center/Width");
            opts.addOption("noauto", false,
                    "disable auto-windowing for images w/o VOI attributes");
            OptionBuilder.withArgName("file");
            OptionBuilder.hasArg();
            OptionBuilder.withDescription(
                    "file path of P-Value to gray value map");
            opts.addOption(OptionBuilder.create("pv2gray"));
            OptionBuilder.withArgName(".xxx");
            OptionBuilder.hasArg();
            OptionBuilder.withDescription(
                    "jpeg file extension used with destination directory argument,"
                    + " default: '.jpg'.");
            opts.addOption(OptionBuilder.create("jpgext"));
            opts.addOption("h", "help", false, "print this message");
            opts.addOption("V", "version", false,
                    "print the version information and exit");
            CommandLine cl = null;
            try {
                cl = new GnuParser().parse(opts, args);
            } catch (ParseException e) {
                exit("dcm2jpg: " + e.getMessage());
                throw new RuntimeException("unreachable");
            }
            if (cl.hasOption('V')) {
                Package p = Dcm2Jpeg.class.getPackage();
                System.out.println("dcm2jpg v" + p.getImplementationVersion());
                System.exit(0);
            }
            if (cl.hasOption('h') || cl.getArgList().size() < 2) {
                HelpFormatter formatter = new HelpFormatter();
                formatter.printHelp(USAGE, DESCRIPTION, opts, EXAMPLE);
                System.exit(0);
            }
            return cl;
        }
    
    private static int parseInt(String s, String errPrompt, int min, int max) {
            try {
                int i = Integer.parseInt(s);
                if (i >= min && i <= max)
                    return i;
            } catch (NumberFormatException e) {
                // parameter is not a valid integer; fall through to exit
            }
            exit(errPrompt);
            throw new RuntimeException();
    }
    
    private static float parseFloat(String s, String errPrompt) {
            try {
                return Float.parseFloat(s);
            } catch (NumberFormatException e) {
                exit(errPrompt);
                throw new RuntimeException();
            }
     }
    
      private static void exit(String msg) {
            System.err.println(msg);
            System.err.println("Try 'dcm2jpg -h' for more information.");
            System.exit(1);
        }
    
    }
    

    这是将jpg转pdf的源代码

    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    
    import javax.imageio.ImageIO;
    import javax.swing.JFileChooser;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Image;
    import com.itextpdf.text.PageSize;
    import com.itextpdf.text.Rectangle;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class JPGToPDFConverter {
        public static void main(String[] args) {
    
            selectImage();
        }
    
        // allow images selection for converting
        public static void selectImage() {
    
            JFileChooser chooser = new JFileChooser();
            FileNameExtensionFilter filter = new FileNameExtensionFilter("Images",
                    "jpg", "gif", "png", "bmp");
            chooser.setFileFilter(filter);
            chooser.setMultiSelectionEnabled(true);
            int returnVal = chooser.showOpenDialog(null);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File[] Files = chooser.getSelectedFiles();
                System.out.println("Please wait...");
                for (int i = 0; i < Files.length; i++) {
                    convertJPGToPDF(Files[i].toString(), "pdfimage" + i + ".pdf");
                }
                System.out.println("Conversion complete");
            }
        }
    
        public static void convertJPGToPDF(String strimg, String desc) {
            try {
                // create document object
                Document doc = new Document();
                // create pdf writer object to write the document to the output file
                PdfWriter.getInstance(doc, new FileOutputStream(desc));
                // get a4 paper size
                Rectangle r = PageSize.A4;
                // read the image
                BufferedImage orImg = ImageIO.read(new File(strimg));
                // initialize image width and height
                int width = orImg.getWidth();
                int height = orImg.getHeight();
                // resize the image that is bigger than A4 size
                if (width > r.getWidth())
                    width = (int) r.getWidth();
                if (height > r.getHeight())
                    height = (int) r.getHeight();
                // create a blank buffered image
                BufferedImage bi = new BufferedImage(width, height,
                        BufferedImage.TYPE_INT_RGB);
                // create graphic2d object from the buffered image
                Graphics2D g2d = bi.createGraphics();
                // draw the original image on the buffered image
                // so the image is resized to fit the A4 paper size if it is bigger
                // than A4 size
                g2d.drawImage(orImg, 0, 0, width, height, null);
                // store the image data in memory
                ByteArrayOutputStream bas = new ByteArrayOutputStream();
                ImageIO.write(bi, "png", bas);
                // create image from the image data stored in memory
                Image img = Image.getInstance(bas.toByteArray());
                // centrally align the image on the pdf page
                img.setAlignment(Element.ALIGN_CENTER);
                // open document
                doc.open();
                // add image to the document
                doc.add(img);
                // close the document
                doc.close();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    jpg转pdf的转换代码需要下载this jar file iTextPDF

    【讨论】:

      【解决方案3】:

      使用 dcm4che (the updated re-written one) 和 itext 库将 dicom 文件的页面转换为 pdf 的简化解决方案。

      public void convert(InputStream inStream, OutputStream outStream, String fileName) throws Exception {
          Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
          ImageReader reader = iter.next();
          reader.setInput(inStream);
      
          Document document = new Document();
          Rectangle pageSize = PageSize.LETTER;
          document.setPageSize(pageSize);
          document.setMargins(0f, 0f, 0f, 0f);
          PdfWriter writer = PdfWriter.getInstance(document, outStream);
          document.open();
      
          int pageNum = 0;
          boolean finished = false;
          while (!finished) {
              try {
                  // read each dicom page as an image
                  BufferedImage bi = reader.read(pageNum);
                  if (bi == null) {
                      throw new RuntimeException("Couldn't read " + fileName);
                  }
      
                  PdfContentByte pdfCB = new PdfContentByte(writer);
                  Image image = Image.getInstance(pdfCB, bi, 1);
      
                  // scale the image down to fit on the page width-wise
                  if (image.getWidth() > pageSize.getWidth() || image.getHeight() > pageSize.getHeight()) {
                      image.scaleToFit(pageSize);
                  }
      
                  // align to the middle horizontally
                  image.setAlignment(Element.ALIGN_CENTER);
      
                  document.add(image);
      
              } catch (IndexOutOfBoundsException ioobe) {
                  finished = true;
              }
              pageNum += 1;
          }
      
          document.close();
      
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-08
        • 2019-06-03
        • 2010-12-23
        • 2011-11-26
        • 2012-02-07
        • 1970-01-01
        • 1970-01-01
        • 2013-07-11
        • 2016-07-10
        相关资源
        最近更新 更多