package co.smartreceipts.android.workers.reports.pdf.pdfbox;
import android.content.Context;
import android.support.annotation.NonNull;
import com.tom_roush.pdfbox.pdmodel.PDDocument;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import co.smartreceipts.android.model.Column;
import co.smartreceipts.android.model.Distance;
import co.smartreceipts.android.model.Receipt;
import co.smartreceipts.android.model.Trip;
import co.smartreceipts.android.settings.UserPreferenceManager;
import co.smartreceipts.android.utils.log.Logger;
import co.smartreceipts.android.workers.reports.pdf.PdfReportFile;
import co.smartreceipts.android.workers.reports.pdf.colors.PdfColorManager;
import co.smartreceipts.android.workers.reports.pdf.fonts.PdfFontManager;
public class PdfBoxReportFile implements PdfReportFile, PdfBoxSectionFactory {
private final DefaultPdfBoxContext pdfBoxContext;
private final PDDocument pdDocument;
private final List<PdfBoxSection> sections;
public PdfBoxReportFile(@NonNull Context androidContext, @NonNull UserPreferenceManager preferences) throws IOException {
pdDocument = new PDDocument();
sections = new ArrayList<>();
final PdfColorManager colorManager = new PdfColorManager();
final PdfFontManager fontManager = new PdfFontManager(androidContext, pdDocument);
fontManager.initialize();
pdfBoxContext = new DefaultPdfBoxContext(androidContext, fontManager, colorManager, preferences);
}
@Override
public void writeFile(@NonNull OutputStream outStream, @NonNull Trip trip) throws IOException {
try {
final PdfBoxWriter writer = new PdfBoxWriter(pdDocument, pdfBoxContext, new DefaultPdfBoxPageDecorations(pdfBoxContext, trip));
for (PdfBoxSection section : sections) {
section.writeSection(pdDocument, writer);
}
writer.writeAndClose();
pdDocument.save(outStream);
} finally {
try {
pdDocument.close();
} catch (IOException e) {
Logger.error(this, e);
}
}
}
public void addSection(PdfBoxSection section) {
sections.add(section);
}
@NonNull
@Override
public PdfBoxReceiptsTablePdfSection createReceiptsTableSection(
@NonNull Trip trip, @NonNull List<Receipt> receipts, @NonNull List<Column<Receipt>> columns,
@NonNull List<Distance> distances, @NonNull List<Column<Distance>> distanceColumns) {
return new PdfBoxReceiptsTablePdfSection(pdfBoxContext, trip, receipts, columns, distances, distanceColumns);
}
@NonNull
@Override
public PdfBoxReceiptsImagesPdfSection createReceiptsImagesSection(@NonNull Trip trip, @NonNull List<Receipt> receipts) {
return new PdfBoxReceiptsImagesPdfSection(pdfBoxContext, pdDocument, trip, receipts);
}
}