Method of data collection
mkdir -p /home/daytona/workspace/data-collection-pdf && ls /home/daytona/workspa…
~/data-collection-pdf/create_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, ListFlowable, ListItem
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
OUTPUT = "/home/daytona/workspace/data-collection-pdf/Methods_of_Data_Collection.pdf"
# ── Page setup ──────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2.5*cm, rightMargin=2.5*cm,
topMargin=2.5*cm, bottomMargin=2.5*cm,
title="Methods of Data Collection",
author="Research Methodology Notes",
)
W, H = A4
styles = getSampleStyleSheet()
# ── Custom styles ────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a3c5e")
MID_BLUE = colors.HexColor("#2e6da4")
LIGHT_BLUE = colors.HexColor("#d6e8f7")
ACCENT = colors.HexColor("#f0a500")
LIGHT_GRAY = colors.HexColor("#f5f5f5")
TEXT_DARK = colors.HexColor("#222222")
cover_title = ParagraphStyle("cover_title",
fontName="Helvetica-Bold", fontSize=28, textColor=colors.white,
alignment=TA_CENTER, spaceAfter=10, leading=34)
cover_sub = ParagraphStyle("cover_sub",
fontName="Helvetica", fontSize=14, textColor=colors.HexColor("#d0e8ff"),
alignment=TA_CENTER, spaceAfter=6, leading=20)
cover_tag = ParagraphStyle("cover_tag",
fontName="Helvetica-Oblique", fontSize=11, textColor=colors.HexColor("#ffe0a0"),
alignment=TA_CENTER, leading=16)
h1 = ParagraphStyle("h1",
fontName="Helvetica-Bold", fontSize=16, textColor=DARK_BLUE,
spaceBefore=18, spaceAfter=6, leading=20)
h2 = ParagraphStyle("h2",
fontName="Helvetica-Bold", fontSize=12, textColor=MID_BLUE,
spaceBefore=14, spaceAfter=4, leading=16)
h3 = ParagraphStyle("h3",
fontName="Helvetica-BoldOblique", fontSize=11, textColor=DARK_BLUE,
spaceBefore=10, spaceAfter=3, leading=14)
body = ParagraphStyle("body",
fontName="Helvetica", fontSize=10, textColor=TEXT_DARK,
spaceAfter=5, leading=15, alignment=TA_JUSTIFY)
bullet_style = ParagraphStyle("bullet",
fontName="Helvetica", fontSize=10, textColor=TEXT_DARK,
spaceAfter=3, leading=14, leftIndent=16, bulletIndent=4)
note_style = ParagraphStyle("note",
fontName="Helvetica-Oblique", fontSize=9, textColor=colors.HexColor("#555555"),
spaceAfter=4, leading=13, leftIndent=10)
def HR():
return HRFlowable(width="100%", thickness=1, color=LIGHT_BLUE, spaceAfter=8, spaceBefore=4)
def section_banner(text, bg=DARK_BLUE, fg=colors.white):
data = [[Paragraph(f'<font color="white"><b>{text}</b></font>', ParagraphStyle(
"banner_text", fontName="Helvetica-Bold", fontSize=13,
textColor=fg, alignment=TA_LEFT, leading=18))]]
t = Table(data, colWidths=[W - 5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [4]),
]))
return t
def highlight_box(text, bg=LIGHT_BLUE):
data = [[Paragraph(text, ParagraphStyle(
"hbox", fontName="Helvetica", fontSize=10,
textColor=TEXT_DARK, alignment=TA_JUSTIFY, leading=14))]]
t = Table(data, colWidths=[W - 5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("BOX", (0,0), (-1,-1), 0.5, MID_BLUE),
]))
return t
def two_col_table(headers, rows, col_widths=None):
if col_widths is None:
col_widths = [(W-5*cm)*0.35, (W-5*cm)*0.65]
data = [[Paragraph(f"<b>{h}</b>", ParagraphStyle("th",
fontName="Helvetica-Bold", fontSize=10,
textColor=colors.white, alignment=TA_CENTER)) for h in headers]]
for r in rows:
data.append([Paragraph(str(c), body) for c in r])
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("BACKGROUND", (0,1), (-1,-1), LIGHT_GRAY),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.white, LIGHT_GRAY]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#bbbbbb")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
# ═══════════════════════════════════════════════════════════════════════════
# BUILD STORY
# ═══════════════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ───────────────────────────────────────────────────────────────
cover_data = [[
Spacer(1, 2.5*cm),
Paragraph("METHODS OF DATA COLLECTION", cover_title),
Spacer(1, 0.4*cm),
Paragraph("Research Methodology", cover_sub),
Spacer(1, 0.3*cm),
Paragraph("Undergraduate Study Notes", cover_tag),
Spacer(1, 1.2*cm),
Paragraph("A complete reference covering Primary & Secondary methods,<br/>"
"Qualitative & Quantitative approaches, tools, advantages,<br/>"
"limitations, and selection criteria.", cover_sub),
Spacer(1, 2.5*cm),
Paragraph("Research Methodology | Unit: Data Collection", cover_tag),
]]
cover_table = Table([[cell] for cell in cover_data[0]], colWidths=[W - 5*cm])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0),
("LEFTPADDING", (0,0), (-1,-1), 30),
("RIGHTPADDING", (0,0), (-1,-1), 30),
("ROUNDEDCORNERS", [8]),
]))
story.append(cover_table)
story.append(PageBreak())
# ── TABLE OF CONTENTS ────────────────────────────────────────────────────────
story.append(section_banner("TABLE OF CONTENTS"))
story.append(Spacer(1, 0.3*cm))
toc_items = [
("1.", "Introduction to Data Collection"),
("2.", "Classification of Data Collection Methods"),
("3.", "Primary Data Collection Methods"),
(" 3.1", "Observation Method"),
(" 3.2", "Interview Method"),
(" 3.3", "Questionnaire Method"),
(" 3.4", "Schedule Method"),
(" 3.5", "Experiment Method"),
(" 3.6", "Case Study Method"),
(" 3.7", "Focus Group Discussion (FGD)"),
("4.", "Secondary Data Collection Methods"),
("5.", "Qualitative vs Quantitative Methods"),
("6.", "Comparison of Data Collection Methods"),
("7.", "How to Choose the Right Method"),
("8.", "Key Terms / Glossary"),
]
for num, title in toc_items:
story.append(Paragraph(f"<b>{num}</b> {title}", bullet_style))
story.append(PageBreak())
# ── 1. INTRODUCTION ──────────────────────────────────────────────────────────
story.append(section_banner("1. Introduction to Data Collection"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Data collection is the process of gathering and measuring information on targeted variables "
"in an established systematic fashion, which then enables one to answer relevant questions and "
"evaluate outcomes. It is the foundational step in any research process.", body))
story.append(Spacer(1, 0.2*cm))
story.append(highlight_box(
"<b>Definition:</b> Data collection refers to the systematic process of gathering observations "
"or measurements. Whether you are performing research for business, governmental, or academic "
"purposes, data collection allows you to gain first-hand knowledge and original insights."))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("<b>Objectives of Data Collection:</b>", h2))
objectives = [
"To obtain information to draw reasoned conclusions.",
"To provide a basis for better decision-making.",
"To ensure that accurate and reliable information is available for statistical analysis.",
"To gather evidence for or against a hypothesis.",
"To describe the existing state of affairs (descriptive research).",
]
for obj in objectives:
story.append(Paragraph(f"• {obj}", bullet_style))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Important qualities of good data collection:</b>", h2))
quality_data = [
["Quality", "Description"],
["Validity", "The data actually measures what it claims to measure."],
["Reliability", "The data is consistent and can be reproduced under the same conditions."],
["Accuracy", "Free from errors and biases."],
["Completeness", "All required data is collected without gaps."],
["Timeliness", "Data is collected within the required time frame."],
]
story.append(two_col_table(quality_data[0], quality_data[1:]))
story.append(PageBreak())
# ── 2. CLASSIFICATION ────────────────────────────────────────────────────────
story.append(section_banner("2. Classification of Data Collection Methods"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Data collection methods can be broadly classified on the basis of the source of data "
"and the nature of the data collected:", body))
story.append(Spacer(1, 0.3*cm))
class_data = [
["Basis", "Type", "Examples"],
["Source of Data", "Primary Data", "Surveys, Interviews, Experiments, Observations"],
["Source of Data", "Secondary Data", "Books, Journals, Government reports, Websites"],
["Nature of Data", "Quantitative", "Surveys with numerical scales, Experiments"],
["Nature of Data", "Qualitative", "Interviews, Focus Groups, Observation"],
]
col_w = [(W-5*cm)*0.25, (W-5*cm)*0.25, (W-5*cm)*0.50]
story.append(two_col_table(["Basis", "Type", "Examples"], class_data[1:], col_widths=col_w))
story.append(Spacer(1, 0.4*cm))
story.append(highlight_box(
"<b>Primary Data:</b> Collected fresh, for the first time, and is original in character.<br/>"
"<b>Secondary Data:</b> Already collected by someone else and available in published/unpublished sources."))
story.append(PageBreak())
# ── 3. PRIMARY METHODS ───────────────────────────────────────────────────────
story.append(section_banner("3. Primary Data Collection Methods"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Primary data is collected directly by the researcher through various field methods. "
"The main primary data collection methods are described below.", body))
story.append(Spacer(1, 0.2*cm))
# 3.1 Observation
story.append(Paragraph("3.1 Observation Method", h2))
story.append(Paragraph(
"The observation method involves watching and recording the behavior of subjects in their "
"natural environment without interacting with them. It is widely used in behavioral sciences, "
"anthropology, and market research.", body))
obs_data = [
["Aspect", "Details"],
["Types", "Participant Observation, Non-Participant Observation, Structured, Unstructured, Direct, Indirect"],
["Advantages", "Natural behavior captured; no interviewer bias; useful where subjects cannot communicate"],
["Limitations", "Time-consuming; observer bias possible; not suitable for large populations; past events cannot be observed"],
["Best Used For", "Behavioral studies, field research, ethnographic studies"],
]
story.append(two_col_table(obs_data[0], obs_data[1:]))
story.append(Spacer(1, 0.3*cm))
# 3.2 Interview
story.append(Paragraph("3.2 Interview Method", h2))
story.append(Paragraph(
"An interview is a face-to-face (or telephone/online) conversation between the researcher "
"(interviewer) and the respondent to gather information.", body))
int_data = [
["Aspect", "Details"],
["Types", "Structured Interview, Unstructured Interview, Semi-structured Interview, In-depth Interview"],
["Advantages", "High response rate; clarification possible; flexible; captures non-verbal cues"],
["Limitations", "Expensive; time-consuming; interviewer bias; not suitable for large samples"],
["Best Used For", "Exploratory research, sensitive topics, in-depth understanding"],
]
story.append(two_col_table(int_data[0], int_data[1:]))
story.append(Spacer(1, 0.3*cm))
# 3.3 Questionnaire
story.append(Paragraph("3.3 Questionnaire Method", h2))
story.append(Paragraph(
"A questionnaire is a set of printed or written questions with a choice of answers, devised "
"for the purposes of a survey or statistical study. It is one of the most widely used data "
"collection tools in research.", body))
q_data = [
["Aspect", "Details"],
["Types", "Mailed questionnaire, Online questionnaire, Telephone questionnaire, Hand-delivered questionnaire"],
["Question Types", "Open-ended, Close-ended, Likert scale, Dichotomous, Rating scale, Multiple choice"],
["Advantages", "Economical; wide coverage; no interviewer bias; respondents can take time"],
["Limitations", "Low response rate; cannot clarify doubts; limited to literate respondents"],
["Best Used For", "Large-scale surveys, opinion polls, social research"],
]
story.append(two_col_table(q_data[0], q_data[1:]))
story.append(Spacer(1, 0.3*cm))
# 3.4 Schedule
story.append(Paragraph("3.4 Schedule Method", h2))
story.append(Paragraph(
"A schedule is similar to a questionnaire, but is filled in by the researcher (enumerator) "
"after interviewing the respondent. Unlike a questionnaire, it requires a trained field worker.", body))
sch_data = [
["Aspect", "Details"],
["Difference from Questionnaire", "Filled by enumerator (not respondent); suitable for illiterate respondents"],
["Advantages", "High response rate; suitable for illiterate populations; data accuracy is high"],
["Limitations", "Expensive; needs trained enumerators; time-consuming; possible enumerator bias"],
["Best Used For", "Census surveys, government data collection, rural studies"],
]
story.append(two_col_table(sch_data[0], sch_data[1:]))
story.append(PageBreak())
# 3.5 Experiment
story.append(Paragraph("3.5 Experiment Method", h2))
story.append(Paragraph(
"The experimental method involves manipulating one or more independent variables to observe "
"the effect on a dependent variable. It is the most rigorous scientific method for establishing "
"cause-and-effect relationships.", body))
exp_data = [
["Aspect", "Details"],
["Types", "Laboratory Experiment, Field Experiment, Natural Experiment"],
["Key Concepts", "Control group, Treatment group, Randomization, Blind/Double-blind design"],
["Advantages", "Establishes causality; controlled conditions; replicable"],
["Limitations", "Artificial settings; ethical issues; not applicable to all research questions"],
["Best Used For", "Sciences, psychology, medicine, agricultural research"],
]
story.append(two_col_table(exp_data[0], exp_data[1:]))
story.append(Spacer(1, 0.3*cm))
# 3.6 Case Study
story.append(Paragraph("3.6 Case Study Method", h2))
story.append(Paragraph(
"A case study is an in-depth, detailed examination of a particular case (individual, group, "
"event, organization) within its real-life context.", body))
cs_data = [
["Aspect", "Details"],
["Types", "Exploratory, Descriptive, Explanatory case studies"],
["Data Sources", "Interviews, documents, observations, archival records"],
["Advantages", "Deep understanding; rich qualitative data; real-world context"],
["Limitations", "Not generalizable; time-intensive; researcher bias"],
["Best Used For", "Business studies, psychology, social sciences, policy research"],
]
story.append(two_col_table(cs_data[0], cs_data[1:]))
story.append(Spacer(1, 0.3*cm))
# 3.7 FGD
story.append(Paragraph("3.7 Focus Group Discussion (FGD)", h2))
story.append(Paragraph(
"A focus group is a moderated discussion with a small, carefully selected group of people "
"(typically 6-12) to collect qualitative data about their attitudes, perceptions, and opinions "
"on a specific topic.", body))
fgd_data = [
["Aspect", "Details"],
["Group Size", "6-12 participants; moderated by a trained facilitator"],
["Advantages", "Rich qualitative data; group interaction sparks ideas; relatively quick"],
["Limitations", "Groupthink; dominant voices; not generalizable; requires skilled moderator"],
["Best Used For", "Market research, product testing, policy development, needs assessment"],
]
story.append(two_col_table(fgd_data[0], fgd_data[1:]))
story.append(PageBreak())
# ── 4. SECONDARY DATA ────────────────────────────────────────────────────────
story.append(section_banner("4. Secondary Data Collection Methods"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Secondary data refers to data already collected by someone else for some other purpose. "
"The researcher uses it for their own study.", body))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Sources of Secondary Data:</b>", h2))
sec_sources = [
["Source Type", "Examples"],
["Published Sources", "Books, journals, newspapers, research reports, encyclopedias, government publications"],
["Unpublished Sources", "Diaries, letters, internal company records, unpublished theses"],
["Electronic Sources", "Websites, online databases (JSTOR, PubMed), e-books, social media data"],
["Official Statistics", "Census data, national accounts, health statistics, World Bank data"],
["Historical Records", "Archives, historical documents, past surveys and datasets"],
]
story.append(two_col_table(sec_sources[0], sec_sources[1:]))
story.append(Spacer(1, 0.3*cm))
story.append(highlight_box(
"<b>Advantages of Secondary Data:</b> Economical; saves time; useful for longitudinal studies; "
"can provide large sample sizes.<br/><br/>"
"<b>Limitations of Secondary Data:</b> May be outdated; may not fit research purpose; "
"reliability cannot always be verified; possible bias in original collection."))
story.append(PageBreak())
# ── 5. QUALITATIVE vs QUANTITATIVE ──────────────────────────────────────────
story.append(section_banner("5. Qualitative vs Quantitative Methods"))
story.append(Spacer(1, 0.2*cm))
qq_data = [
["Feature", "Qualitative", "Quantitative"],
["Nature of Data", "Words, text, meanings", "Numbers, statistics"],
["Purpose", "Explore, understand, describe", "Measure, test, predict"],
["Sample Size", "Small (purposive)", "Large (random)"],
["Methods Used", "Interviews, FGD, observation, case study", "Surveys, experiments, structured observation"],
["Analysis", "Thematic, content, narrative analysis", "Statistical tests (t-test, ANOVA, regression)"],
["Flexibility", "High - adaptable design", "Low - fixed design"],
["Generalizability", "Limited", "High"],
["Examples", "Ethnographic study of a community", "National survey of student performance"],
]
col_w3 = [(W-5*cm)*0.28, (W-5*cm)*0.36, (W-5*cm)*0.36]
story.append(two_col_table(qq_data[0], qq_data[1:], col_widths=col_w3))
story.append(Spacer(1, 0.3*cm))
story.append(highlight_box(
"<b>Mixed Methods:</b> Many modern studies combine both qualitative and quantitative "
"approaches to get a fuller picture. This is called the <b>Mixed Methods Approach</b> "
"and is increasingly preferred in social and health sciences."))
story.append(PageBreak())
# ── 6. COMPARISON TABLE ──────────────────────────────────────────────────────
story.append(section_banner("6. Comparison of Primary Data Collection Methods"))
story.append(Spacer(1, 0.2*cm))
comp_data = [
["Method", "Cost", "Time", "Sample Size", "Suitability"],
["Observation", "Medium-High", "High", "Small", "Behavioral/field studies"],
["Interview", "High", "High", "Small-Medium", "In-depth/exploratory"],
["Questionnaire", "Low", "Low-Medium", "Large", "Large-scale surveys"],
["Schedule", "Medium-High", "Medium-High", "Medium", "Illiterate populations"],
["Experiment", "High", "Medium-High", "Small-Medium", "Causal research"],
["Case Study", "Medium", "High", "Very Small", "In-depth single cases"],
["Focus Group", "Medium", "Medium", "Small", "Attitudes/opinions"],
]
col_w5 = [(W-5*cm)*0.22, (W-5*cm)*0.14, (W-5*cm)*0.14, (W-5*cm)*0.18, (W-5*cm)*0.32]
story.append(two_col_table(comp_data[0], comp_data[1:], col_widths=col_w5))
story.append(PageBreak())
# ── 7. HOW TO CHOOSE ─────────────────────────────────────────────────────────
story.append(section_banner("7. How to Choose the Right Method"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Selecting the appropriate data collection method depends on several factors. "
"No single method is universally best - the choice should match the research objectives.", body))
story.append(Spacer(1, 0.2*cm))
factors = [
("Research Objective", "Exploratory research benefits from qualitative methods; "
"descriptive/causal research suits quantitative methods."),
("Nature of Information", "Sensitive topics require personal interviews; "
"factual/numerical data suits questionnaires or experiments."),
("Available Resources", "Limited budget/time favors questionnaires and secondary data; "
"sufficient resources allow interviews and experiments."),
("Population Characteristics", "Large, geographically dispersed populations - use questionnaires/online surveys; "
"illiterate populations - use schedules or interviews."),
("Accuracy Required", "High accuracy needs experiments or structured observation; "
"general trends can use surveys."),
("Time Available", "Quick studies - questionnaires, secondary data; "
"long studies - case studies, ethnography."),
]
for factor, desc in factors:
story.append(Paragraph(f"<b>{factor}:</b> {desc}", bullet_style))
story.append(Spacer(1, 0.1*cm))
story.append(Spacer(1, 0.2*cm))
story.append(highlight_box(
"<b>Triangulation:</b> Using more than one data collection method for the same study "
"increases the validity and reliability of findings. This is called triangulation. "
"For example, combining interviews with questionnaires and observation."))
story.append(PageBreak())
# ── 8. GLOSSARY ──────────────────────────────────────────────────────────────
story.append(section_banner("8. Key Terms / Glossary"))
story.append(Spacer(1, 0.2*cm))
glossary = [
("Primary Data", "Data collected for the first time directly from the source by the researcher."),
("Secondary Data", "Data already collected by someone else and available in various sources."),
("Questionnaire", "A printed set of questions given to respondents to fill in themselves."),
("Schedule", "Similar to questionnaire but filled in by an enumerator after interviewing the respondent."),
("Observation", "A method of collecting data by watching behavior in natural or controlled settings."),
("Interview", "A face-to-face or remote conversation to elicit information from respondents."),
("Hypothesis", "A testable statement or proposition that guides the direction of a study."),
("Variable", "Any characteristic, attribute, or condition that can take different values."),
("Respondent", "A person who provides data in response to a questionnaire or interview."),
("Reliability", "The consistency of a measure - same results under same conditions."),
("Validity", "The degree to which a method measures what it is supposed to measure."),
("Triangulation", "Using multiple methods or sources to cross-verify research findings."),
("Bias", "A systematic error that skews research findings away from the truth."),
("Pilot Study", "A small-scale preliminary study conducted before the main research."),
("Sampling", "The process of selecting a subset of individuals from a population for study."),
]
glos_data = [["Term", "Definition"]] + [[t, d] for t, d in glossary]
col_wg = [(W-5*cm)*0.28, (W-5*cm)*0.72]
story.append(two_col_table(glos_data[0], glos_data[1:], col_widths=col_wg))
story.append(Spacer(1, 0.5*cm))
story.append(HR())
story.append(Paragraph(
"End of Notes - Methods of Data Collection | Research Methodology",
ParagraphStyle("footer_note", fontName="Helvetica-Oblique", fontSize=9,
textColor=colors.HexColor("#888888"), alignment=TA_CENTER)))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
python /home/daytona/workspace/data-collection-pdf/create_pdf.py
Methods of Data Collection
PDF Document · PDF