From 930eb2f651cea4ab8e7227fd7e093d538702c6bd Mon Sep 17 00:00:00 2001 From: Tilman Date: Thu, 20 Dec 2018 15:39:35 +0100 Subject: [PATCH] Layout and Spotify done --- .../src/tutorial/chapter01/CardCreator.java | 305 ++++++++++++++++++ .../src/tutorial/chapter01/SimpleTable.java | 222 ------------- 2 files changed, 305 insertions(+), 222 deletions(-) create mode 100644 cardcreator/src/tutorial/chapter01/CardCreator.java delete mode 100644 cardcreator/src/tutorial/chapter01/SimpleTable.java diff --git a/cardcreator/src/tutorial/chapter01/CardCreator.java b/cardcreator/src/tutorial/chapter01/CardCreator.java new file mode 100644 index 0000000..c1f7c91 --- /dev/null +++ b/cardcreator/src/tutorial/chapter01/CardCreator.java @@ -0,0 +1,305 @@ +package tutorial.chapter01; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import com.itextpdf.barcodes.BarcodeQRCode; +import com.itextpdf.io.image.ImageDataFactory; +import com.itextpdf.kernel.colors.ColorConstants; +import com.itextpdf.kernel.geom.PageSize; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfNumber; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.borders.SolidBorder; +import com.itextpdf.layout.element.Cell; +import com.itextpdf.layout.element.Image; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.layout.element.Table; +import com.itextpdf.layout.property.TextAlignment; +import com.itextpdf.layout.property.UnitValue; +import com.wrapper.spotify.SpotifyApi; +import com.wrapper.spotify.exceptions.SpotifyWebApiException; +import com.wrapper.spotify.model_objects.credentials.ClientCredentials; +import com.wrapper.spotify.model_objects.specification.Album; +import com.wrapper.spotify.model_objects.specification.Track; +import com.wrapper.spotify.requests.authorization.client_credentials.ClientCredentialsRequest; + +public class CardCreator { + + public static final int slotsPerLine = 9; + public static final int cardsPerLine = 7; + public static final boolean generateBacksides = true; + public static final boolean retrieveImageFiles = true; + + public static final String DEST = "results/simple_table.pdf"; + public static final PdfNumber INVERTEDPORTRAIT = new PdfNumber(180); + public static final PdfNumber LANDSCAPE = new PdfNumber(90); + public static final PdfNumber PORTRAIT = new PdfNumber(0); + public static final PdfNumber SEASCAPE = new PdfNumber(270); + + private static final String clientId = "d104434912874fbf9ff42e5a91db5179"; + private static final String clientSecret = "6acdb874210942128ba4991c4f7228b5"; + + private static final SpotifyApi spotifyApi = new SpotifyApi.Builder().setClientId(clientId) + .setClientSecret(clientSecret).build(); + private static final ClientCredentialsRequest clientCredentialsRequest = spotifyApi.clientCredentials().build(); + + public CardCreator(List links) { + List cards; + + try { + final ClientCredentials clientCredentials = clientCredentialsRequest.execute(); + + // Set access token for further "spotifyApi" object usage + spotifyApi.setAccessToken(clientCredentials.getAccessToken()); + + cards = fetchCardData(links); + + File file = new File(DEST); + file.getParentFile().mkdirs(); + + createPdf(DEST, sortCards(cards)); + + } catch (IOException | SpotifyWebApiException e) { + System.out.println("Error: " + e.getMessage()); + e.printStackTrace(); + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + e.printStackTrace(); + } + } + + protected List fetchCardData(List links) throws SpotifyWebApiException, IOException { + List cards = new LinkedList(); + + for (String link : links) { + System.out.println(link); + + Card card = new Card(link); + card.qrcode = new BarcodeQRCode(link); + cards.add(card); + + if (link.startsWith("spotify:album:")) { + String spotifyId = link.substring(14); + Album album = spotifyApi.getAlbum(spotifyId).build().execute(); + card.title = album.getName(); + card.artist = album.getArtists()[0].getName(); + + URL url = new URL(album.getImages()[0].getUrl()); + card.cover = new Image(ImageDataFactory.create(url)); + } + else if (link.startsWith("spotify:track:") ) { + String spotifyId = link.substring(14); + Track track = spotifyApi.getTrack(spotifyId).build().execute(); + card.title = track.getName(); + card.artist = track.getArtists()[0].getName(); + URL url = new URL(track.getAlbum().getImages()[0].getUrl()); + card.cover = new Image(ImageDataFactory.create(url)); + } + else if (link.startsWith("http://")) { + card.title = link; + card.artist = ""; + } + else { + card.title = link; + card.artist = ""; + } + } + + return cards; + } + + private List> sortCards(List cards) { + List> lines = new LinkedList>(); + + List line = new LinkedList(); + + for (Card card : cards) { + if (line.size() < cardsPerLine) { + line.add(card); + } + else { + lines.add(line); + line = new LinkedList(); + line.add(card); + } + } + + if (line.size() > 0) + lines.add(line); + + if (cardsPerLine < slotsPerLine) { + for (List l : lines) { + boolean addToStart = true; + while (l.size() < slotsPerLine) { + if (addToStart) + l.add(0, null); + else + l.add(null); + addToStart = !addToStart; + } + } + } + + return lines; + } + + protected void createPdf(String dest, List> lines) throws Exception { + + PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest)); + pdfDoc.setDefaultPageSize(PageSize.A4.rotate()); + + Document doc = new Document(pdfDoc); + doc.setMargins(0, 0, 0, 0); + + UnitValue[] colWidths = new UnitValue[slotsPerLine]; + for (int i = 0; i < colWidths.length; i++) + colWidths[i] = new UnitValue(UnitValue.PERCENT, 100/slotsPerLine); + + Table firstLine = null; + + for (List line : lines) { + + Table table = new Table(colWidths); + table.useAllAvailableWidth(); + + for (Card card : line) { + + Cell cell = new Cell(); + cell.setBorder(new SolidBorder(ColorConstants.GRAY, 0.5f, 0.5f)); + cell.setPadding(0); + + if (card != null) { + + Paragraph p = new Paragraph(); + p.setTextAlignment(TextAlignment.CENTER); + p.setPaddingTop(43.62f); + Image qrcode = new Image(card.qrcode.createFormXObject(pdfDoc)); + qrcode.setWidth(10 / 25.4f * 72); + p.add(qrcode); + cell.add(p); + + p = new Paragraph(); + p.setTextAlignment(TextAlignment.CENTER); + p.setPaddingTop(5 / 25.4f * 72); + if (card.cover != null) { + Image cover = card.cover; + cover.setWidth(30 / 25.4f * 72); + p.add(cover); + } + else { + p.setPaddingBottom(30 / 25.4f * 72); + } + cell.add(p); + + p = new Paragraph(); + p.setTextAlignment(TextAlignment.CENTER); + p.setPaddingTop(5 / 25.4f * 72); + p.setFontSize(8f); + p.add(card.artist); + cell.add(p); + + p = new Paragraph(); + p.setTextAlignment(TextAlignment.CENTER); + p.setPaddingTop(3 / 25.4f * 72); + p.setFontSize(9f); + p.setBold(); + p.add(card.title); + cell.add(p); + } + + table.addCell(cell); + } + + table.setMinHeight(105 / 25.4f * 72); + table.setMaxHeight(105 / 25.4f * 72); + doc.add(table); + + if (generateBacksides) { + if (firstLine == null && line != lines.get(lines.size() - 1)) { + firstLine = table; + } + else { + Table tbl1 = new Table(colWidths); + tbl1.useAllAvailableWidth(); + + Table tbl2 = new Table(colWidths); + tbl2.useAllAvailableWidth(); + + for (int i = slotsPerLine - 1; i > 0 ; i--) { + if (firstLine != null) + tbl1.addCell(firstLine.getCell(0, i)); + tbl2.addCell(table.getCell(0, i)); + } + + tbl1.setMinHeight(105 / 25.4f * 72); + tbl1.setMaxHeight(105 / 25.4f * 72); + doc.add(tbl1); + + tbl2.setMinHeight(105 / 25.4f * 72); + tbl2.setMaxHeight(105 / 25.4f * 72); + doc.add(tbl2); + + firstLine = null; + } + } + } + + doc.close(); + } + + + public static void main(String[] args) throws Exception { + + List links = Arrays.asList( + "spotify:album:1X2HXE2lAqdmD8VjiBX8Tn", + "spotify:album:5nCA2mAr3rFzk1A6LZXDYm", + "spotify:album:1Vc2BZntRGIdv3Ul8AM6cz", + "spotify:album:0H3rE11E9DrD3j2gEvQJ5R", + "spotify:album:0YSWLbCg5SpxAb2VOON3mX", + "spotify:track:7oolFzHipTMg2nL7shhdz2", + "http://streamtdy.ir-media-tec.com/live/mp3-128/web/play.mp3", + "hidrive/Kinder/Astrid Lindgren - Lotta zieht um", + "hidrive/Singles/04 - The Funeral.mp3", + "DUMMY01.mp3", + "DUMMY02.mp3", + "DUMMY03.mp3", + "DUMMY04.mp3", + "DUMMY05.mp3", + "DUMMY06.mp3", + "DUMMY07.mp3", + "DUMMY08.mp3", + "DUMMY09.mp3", + "DUMMY10.mp3", + "DUMMY11.mp3", + "DUMMY12.mp3", + "DUMMY13.mp3", + "DUMMY14.mp3", + "DUMMY15.mp3", + "DUMMY16.mp3", + "DUMMY17.mp3", + "DUMMY18.mp3", + "DUMMY19.mp3", + "DUMMY20.mp3" + ); + + new CardCreator(links); + } +} + +class Card { + String title; + String artist; + BarcodeQRCode qrcode; + Image cover; + String link; + + public Card(String link) { + this.link = link; + } +} \ No newline at end of file diff --git a/cardcreator/src/tutorial/chapter01/SimpleTable.java b/cardcreator/src/tutorial/chapter01/SimpleTable.java deleted file mode 100644 index b569701..0000000 --- a/cardcreator/src/tutorial/chapter01/SimpleTable.java +++ /dev/null @@ -1,222 +0,0 @@ -package tutorial.chapter01; - -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.LinkedList; -import java.util.List; - -import com.itextpdf.barcodes.BarcodeQRCode; -import com.itextpdf.io.image.ImageDataFactory; -import com.itextpdf.kernel.colors.ColorConstants; -import com.itextpdf.kernel.geom.PageSize; -import com.itextpdf.kernel.pdf.PdfDocument; -import com.itextpdf.kernel.pdf.PdfNumber; -import com.itextpdf.kernel.pdf.PdfWriter; -import com.itextpdf.layout.Document; -import com.itextpdf.layout.borders.SolidBorder; -import com.itextpdf.layout.element.Cell; -import com.itextpdf.layout.element.Image; -import com.itextpdf.layout.element.Paragraph; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.property.TextAlignment; -import com.itextpdf.layout.property.UnitValue; -import com.wrapper.spotify.SpotifyApi; -import com.wrapper.spotify.exceptions.SpotifyWebApiException; -import com.wrapper.spotify.model_objects.credentials.ClientCredentials; -import com.wrapper.spotify.model_objects.specification.Album; -import com.wrapper.spotify.model_objects.specification.Track; -import com.wrapper.spotify.requests.authorization.client_credentials.ClientCredentialsRequest; - -public class SimpleTable { - - public static final String[] albums = new String[] { - "spotify:album:1X2HXE2lAqdmD8VjiBX8Tn", - "spotify:album:5nCA2mAr3rFzk1A6LZXDYm", - "spotify:album:1Vc2BZntRGIdv3Ul8AM6cz", - "spotify:album:0H3rE11E9DrD3j2gEvQJ5R", - "spotify:album:0YSWLbCg5SpxAb2VOON3mX", - "spotify:track:7oolFzHipTMg2nL7shhdz2", - "http://streamtdy.ir-media-tec.com/live/mp3-128/web/play.mp3", - "hidrive/Kinder/Astrid Lindgren - Lotta zieht um", - "hidrive/Singles/04 - The Funeral.mp3" - }; - - public static final int cardsPerLine = 9; - public static final boolean retrieveImageFiles = true; - - public static final String DEST = "results/simple_table.pdf"; - public static final PdfNumber INVERTEDPORTRAIT = new PdfNumber(180); - public static final PdfNumber LANDSCAPE = new PdfNumber(90); - public static final PdfNumber PORTRAIT = new PdfNumber(0); - public static final PdfNumber SEASCAPE = new PdfNumber(270); - - private static final String clientId = "d104434912874fbf9ff42e5a91db5179"; - private static final String clientSecret = "6acdb874210942128ba4991c4f7228b5"; - - private static final SpotifyApi spotifyApi = new SpotifyApi.Builder().setClientId(clientId) - .setClientSecret(clientSecret).build(); - private static final ClientCredentialsRequest clientCredentialsRequest = spotifyApi.clientCredentials().build(); - - protected List fetchSpotifyData(String[] links) throws SpotifyWebApiException, IOException { - List cards = new LinkedList(); - - for (String link : links) { - System.out.println(link); - - Card card = new Card(link); - card.qrcode = new BarcodeQRCode(link); - cards.add(card); - - if (link.startsWith("spotify:album:")) { - String spotifyId = link.substring(14); - Album album = spotifyApi.getAlbum(spotifyId).build().execute(); - card.title = album.getName(); - card.artist = album.getArtists()[0].getName(); - - URL url = new URL(album.getImages()[0].getUrl()); - card.cover = new Image(ImageDataFactory.create(url)); - } - else if (link.startsWith("spotify:track:") ) { - String spotifyId = link.substring(14); - Track track = spotifyApi.getTrack(spotifyId).build().execute(); - card.title = track.getName(); - card.artist = track.getArtists()[0].getName(); - URL url = new URL(track.getAlbum().getImages()[0].getUrl()); - card.cover = new Image(ImageDataFactory.create(url)); - } - else if (link.startsWith("http://")) { - card.title = link; - card.artist = ""; - } - else { - card.title = link; - card.artist = ""; - } - } - - return cards; - } - - public static void main(String[] args) throws Exception { - - SimpleTable creator = new SimpleTable(); - List cards; - - try { - final ClientCredentials clientCredentials = clientCredentialsRequest.execute(); - - // Set access token for further "spotifyApi" object usage - spotifyApi.setAccessToken(clientCredentials.getAccessToken()); - - System.out.println("Spotify token expires in: " + clientCredentials.getExpiresIn() + " s"); - - cards = creator.fetchSpotifyData(albums); - - File file = new File(DEST); - file.getParentFile().mkdirs(); - - creator.manipulatePdf(DEST, cards); - - } catch (IOException | SpotifyWebApiException e) { - System.out.println("Error: " + e.getMessage()); - } - } - - protected void manipulatePdf(String dest, List cards) throws Exception { - PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest)); - pdfDoc.setDefaultPageSize(PageSize.A4.rotate()); - - Document doc = new Document(pdfDoc); - doc.setMargins(0, 0, 0, 0); - - UnitValue[] colWidths = new UnitValue[9]; - for (int i = 0; i < colWidths.length; i++) - colWidths[i] = new UnitValue(UnitValue.PERCENT, 11.10f); - - Table table = new Table(colWidths); - table.useAllAvailableWidth(); - -// for (int i = 0; i < 17; i++) { -// table.addCell("hi"); -// } - - // TODO -// if (cardsPerLine < 9) { -// int i = 0; -// -// do { -// table.addCell(""); -// i++; -// table.addCell(""); -// i++; -// } while (cardsPerLine + i < 9); -// } - - for (Card card : cards) { - Cell cell = new Cell(); - cell.setPadding(0); - - Paragraph p = new Paragraph(); - p.setTextAlignment(TextAlignment.CENTER); - p.setPaddingTop(43.62f); - Image qrcode = new Image(card.qrcode.createFormXObject(pdfDoc)); - qrcode.setWidth(10 / 25.4f * 72); - p.add(qrcode); - cell.add(p); - - p = new Paragraph(); - p.setTextAlignment(TextAlignment.CENTER); - p.setPaddingTop(5 / 25.4f * 72); - if (card.cover != null) { - Image cover = card.cover; - cover.setWidth(30 / 25.4f * 72); - p.add(cover); - } - else { - p.setPaddingBottom(30 / 25.4f * 72); - } - cell.add(p); - - p = new Paragraph(); - p.setTextAlignment(TextAlignment.CENTER); - p.setPaddingTop(5 / 25.4f * 72); - p.setFontSize(8f); - p.add(card.artist); - cell.add(p); - - p = new Paragraph(); - p.setTextAlignment(TextAlignment.CENTER); - p.setPaddingTop(3 / 25.4f * 72); - p.setFontSize(9f); - p.setBold(); - p.add(card.title); - - cell.setHeight(105 / 25.4f * 72); - cell.add(p); - - cell.setBorder(new SolidBorder(ColorConstants.GRAY, 0.5f, 0.5f)); - table.addCell(cell); - } - - doc.add(table); - - // create backside -// doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); - - - doc.close(); - } -} - -class Card { - String title; - String artist; - BarcodeQRCode qrcode; - Image cover; - String link; - - public Card(String link) { - this.link = link; - } -} \ No newline at end of file